Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Турнирная таблица в 1с

Помогите создать турнирную таблицу в 1с
Ответ:

Не по теме:

Dethmontt,



OvErLoRd, поподробнее можно?)
Вопрос: Таблица для строки другой таблицы

Нужно сделать внешнюю обработку. На форме есть 2 таблицы (Материалы и Продукция). Из одного Материала можно сделать несколько Продукций. Я хочу сделать так, чтобы при Активизации строки таблицы Материалы загружались строки в таблицу Продукция (изначально она пустая, но если юзер уже добавил туда что-то, то потом он должен иметь возможность переключаться между Материалами и в Продукцию должна выводиться соответствующие строки).

Как лучше это сделать? Я уже сделал эту обработку по-другому (все в одной таблице), но работает очень долго. Поэтому волнует быстродействие. Добавить просто 2 таблицы и во второй сделать невидимый пользователю реквизит для привязки к первой таблице? В общем как хранить и выгружать на форму Продукцию по выбору Материала?
Ответ:
Сообщение от SHIFT_969
Добавить просто 2 таблицы и во второй сделать невидимый пользователю реквизит для привязки к первой таблице?
Совершенно верно
Вопрос: Таблица значений с циклическим заполнением колонок

Всем доброго.
Задача - вывести таблицу прихода/расхода товаров за выбранный период с понедельной разбивкой. Решил реализовать как ТаблицуЗначений (сначала думал сделать отчетом, но не нашел, как). Поскольку количество столбцов заранее неизвестно, таблица генерируется программно:
Код:
   
//*** описание ТЗ как реквизита формы
    массивТипаВыбора = новый массив;
    массивТипаВыбора.Добавить(тип("таблицаЗначений"));
    описаниеТипаВыбора = новый описаниеТипов(массивТипаВыбора);
    массивРеквизитов = новый массив;
    массивРеквизитов.Добавить(новый реквизитФормы("ТЗФорма", описаниеТипаВыбора, "", "ТЗформа"));
   
    //*** описание типов
    КЧ = новый КвалификаторыЧисла(10,2);
    КС = новый КвалификаторыСтроки(100);

    мас = новый массив;
    мас.Добавить(тип("Строка"));
    ТипСтрока = новый ОписаниеТипов(мас,,, КС);
    мас.Очистить();

    мас = новый массив;
    мас.Добавить(тип("Число"));
    ТипЧисло = новый ОписаниеТипов(мас,, КЧ);
    мас.Очистить();
    // ***

   //создаем временную таблицу значений
    ТЗ = новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("товар", ТипСтрока, "товар");   
   
    для н=1 по КолвоНедель цикл
        ТЗ.Колонки.Добавить("приход" + н, ТипЧисло, "приход" + н);
        ТЗ.Колонки.Добавить("расход" + н, ТипЧисло, "расход" + н);
    КонецЦикла;
   
    для каждого колонка из тз.Колонки цикл
        массивРеквизитов.Добавить(новый РеквизитФормы(колонка.Имя, колонка.ТипЗначения, "ТЗФорма"));
    КонецЦикла;   
   
    изменитьРеквизиты(массивРеквизитов);
    таблицаПолейВыбора = Элементы.Добавить("ТЗФорма", тип("ТаблицаФормы"));
    таблицаПолейВыбора.ПутьКДанным = "ТЗФорма";
    таблицаПолейВыбора.Отображение = отображениеТаблицы.Список;
   
    для каждого колонка из ТЗ.колонки цикл
        новыйЭлемент = элементы.Добавить(колонка.Имя, тип("ПолеФормы"), таблицаПолейВыбора);
        новыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        новыйЭлемент.ПутьКДанным = "ТЗФорма." + Колонка.Имя;
        новыйЭлемент.Ширина = 10;
    КонецЦикла;
Потом заполняется колонка наименований:
Код:
    запрНом = новый запрос;
    запрНом.Текст = "выбрать ТоварыНаСкладахОбороты.Номенклатура КАК номенклатура
    | из РегистрНакопления.ТоварыНаСкладах.Обороты() КАК ТоварыНаСкладахОбороты";
    ТЗНом = запрНом.Выполнить().Выгрузить();   
       
    для каждого стрНом из ТЗНом цикл
        стрНом = стрНом.номенклатура;
       
        //добавить данную номенклатуру во временную ТЗ
        СтрТЗ = ТЗ.Добавить();
        СтрТЗ.товар = стрНом;
    КонецЦикла;
Наконец, выгружаем товар из временной ТЗ в ТЗ формы:
Код:
ЗначениеВРеквизитФормы(ТЗ, "ТЗФорма");
Проблема - циклическое заполнение приходов и расходов. Если я правильно понимаю, каждая строка этих данных заполняется циклом, вложенным в цикл заполнения колонки товаров. То есть на каждой итерации по заполнению строки с товаром делаем запрос на приход и расход, в который передаем наименование товара, даты начала и конца периода. Результат запроса выгружаем в таблицу значений, которая в итоге имеет одну строку. Это работает, когда показываются данные за весь период, то есть когда есть три колонки: товар, приход, расход.

Но в данном случае требуется по две колонки на каждую неделю. Пусть имена этих колонок будут отличаться номером недели, то есть приход1, расход1, приход2, расход2 и тд. Понятно, что при этом организуется цикл, в котором в запросе на приход и расход вместо конца периода передается дата, бывшая на начало итерации + неделя.

Вопрос возникает при передаче сумм прихода и расхода из таблицы значений по результатам запроса во временную таблицу. Как описать, что в каждой итерации при выгрузке данных из таблицы результата запроса во временную ТЗ цифра в имени колонок прихода и расхода увеличивается на 1? Ведь в целом процесс выгрузки выглядит так:
Код:
        
        ТЗПрихРасхОбор = ЗапрПрихРасхОбор.Выполнить().выгрузить();
        для каждого стрПрихРасхОбор из ТЗПрихРасхОбор цикл
                стрТЗ.приход = стрПрихоРасхОбор.приход;
               стрТЗ.расход = стрПрихоРасхОбор.расход;
                стрТЗ.оборот = стрПрихоРасхОбор.оборот;
         КонецЦикла;
Ответ:
наконец добрался до кода. спасибо, помогло. получилось так:
Код:
ТЗ = ЗапросНоменклатуры();

для н=1 по колвоНедель цикл              
        ТЗ.колонки.добавить("приход" + н, типЧисло, "приход" + н);      
        ТЗ.колонки.добавить("расход" + н, типЧисло, "расход" + н);
    КонецЦикла;
  
    для н = 1 по колвоНедель цикл  
        КолонкаПрих = ТЗ.колонки.найти("приход" + н);
        КолонкаРасх = ТЗ.колонки.найти("расход" + н);
      
        КонецПериода = началоПериода + неделя;
        ТЗПР = ЗапросОборотов(НачалоПериода, КонецПериода);
      
        МПрих = ТЗПР.выгрузитьКолонку(0);
        МРасх = ТЗПР.выгрузитьКолонку(1);          
        ТЗ.загрузитьКолонку(МПрих, КолонкаПрих);
        ТЗ.загрузитьКолонку(Мрасх, КолонкаРасх);
      
        НачалоПериода = КонецПериода;
 КонецЦикла;
оптимизировать не стал (например, по поводу запроса в цикле), так как итоговый вид таблицы изначально не устраивал в плане наглядности, хотелось другого решения. вспомнил про макет и табличный документ, пробую через него
Вопрос: v7: Групповая печать - много документов в одну таблицу

Есть необходимость быстро печатать большое количество первички. Платформа - 7-ка, конфа - типовая бухгалтерия. С этой целью были модифицированы стандартные формы Торг-12 и счета-фактуры, если  обработка ВПФ получает в параметрах объект "таблица" - вывод происходит в него. В конце обработки большая таблица показывается основной обработкой печати, которая и вызывает ВПФ для печати каждого документа. Последние пять лет все работало прекрасно, формировались блоки размером до сотни торг-12 (50 штук *2), дальше эта здоровая простыня выводилась на печать.
Сейчас возникла необходимость сделать печать по той же схеме транспортной накладной. Взял за основу ВПФ торг-12, заменил таблицу Т12 на типовую таблицу транспортной. При выводе результирующей таблицы получаю падение платформы - она молча закрывается. Причем, может закрыться даже на одном документе. Падает на Таб.Показать();. Может упасть, может не упасть, тут как повезет. Если вдруг не упала, и таблицу сохранить - то потом открытая таблица не приводит к закрытию.
Расшифровок нет. Объединенные ячейки разъединял - не помогает.
Вопрос: что так не нравится платформе, что она падает, и как это обойти?
Ответ: Проблема решилась перетаскиванием кусков макета из старой таблицы в новую.
Вопрос: Как не зная структуры таблицы значений обработать ее в Запросе

Здравствуйте. Есть таблица значений. Точные имена колонок не известны. Необходимо обработать таблицу значений и добавить к ней одну колонку и заполнить ее. Заполнение осуществляется на основании одной колонки у которой известно имя.
Самый простой вариант - добавить колонку и обработать таблицу в цикле. Но это не совсем хорошо.
Возможно ли это сделать в запросе?
Спасибо.
Ответ:
В первом приближении:


Код:
Выбрать * ПОМЕСТИТЬ ВТ_ВнешниеДанные ИЗ &Таблица КАК ВнешниеДанные
Ну а дальше:

Код:
Выбрать ВнешниеДанные.*, Таблица.ПОЛЕ1 ИЗ ВТ_ВнешниеДанные КАК ВнешниеДанные
ЛЕВОЕ СОЕДИНЕНИЕ <Таблица> КАК Таблица
ПО ВнешниеДанные.Поле1 = Таблица.Поле1
Вопрос: Чтение ИЗ Excel в Таблицу значений

Всем доброго дня.

Есть ЗУП КОРП 2.5 - обычные формы. Делаю загрузку из екселя. В файле больше 1000 строк.

Проблемы возникли на стадии чтения из файла:

1. Некоторые ячейки не читаются, тип в екселе - дата (если открыть файл или просто перетащить в 1С, то все ок и ячейки заполнены, но при чтении они пустые).
2. Постоянные вылеты, нужно перезагружать 1С, закрывать ексель из диспетчера.
3. Не читается *.xlsx (*.xls с абсолютно такой же начинкой читается).

Функция, которой я перекачиваю ексель в ТаблицаЗначений (нашел, эта хоть как-то работает в отличие от остальных):

Код 1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Функция ПолучитьТЗИзEXCEL(ПутьКФайлу, ИмяНомерСтраницы, Заголовок = Истина, ПерваяСтрока = 0) Экспорт
 
    ТЗ  = Новый ТаблицаЗначений;
 
    #Если Клиент Тогда
        Состояние("Подключение к файлу Excel...");
    #КонецЕсли
    //
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Версия = СтрПолучитьСтроку(СтрЗаменить(Эксель.Version, ".", Символы.ПС), 1);
    Исключение
        Сообщить("Ошибка подключения к "+ПутьКФайлу+" : "+ОписаниеОшибки(),СтатусСообщения.Важное);
        Возврат ТЗ;
    КонецПопытки;
    //
    Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
    // Выбираем данные запросом из таблицы файла по имени страницы
    Если ТипЗнч(ИмяНомерСтраницы) = Тип("Число")  Тогда
        Лист        = Книга.WorkSheets(ИмяНомерСтраницы);
        ИмяСтраницы = Лист.Name;
    Иначе
        ИмяСтраницы = ИмяНомерСтраницы;
    КонецЕсли;
    //
    // Определим диапазон данных Excel
    ПослЯчейка = СтрЗаменить(Книга.WorkSheets(ИмяСтраницы).Cells(1,1).SpecialCells(11).Address, "$", "");
    //
    Эксель.Application.Quit();
    //
    Эксель  = неопределено;
    Книга   = неопределено;
    Лист    = неопределено;
 
    // Подлючаемся
 
    Connection          = Новый COMОбъект("ADODB.Connection");
    Если Версия = "12" ИЛИ Версия = "14" Тогда
        СтрокаПодключения   ="Provider =Microsoft.ACE.OLEDB.12.0;Data Source="+ПутьКФайлу+";Extended Properties=""Excel 12.0 Xml;HDR="+?(Заголовок,"YES","NO")+";IMEX=1""";
    Иначе
        СтрокаПодключения   ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ПутьКФайлу+";Extended Properties=""Excel 8.0;HDR="+?(Заголовок,"YES","NO")+";IMEX=1""";
    КонецЕсли;
 
    Попытка
        Connection.Open(СтрокаПодключения);
    Исключение
        Сообщить("Ошибка подключения!"+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
        Возврат ТЗ;
    КонецПопытки;
 
    Command=Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection=Connection;
    Command.CommandText = ?(ПерваяСтрока = 0, "Select * From [" + ИмяСтраницы + "$]", "Select * From [" + ИмяСтраницы + "$A" + ПерваяСтрока + ":" + ПослЯчейка + "]");
 
    Попытка
        Записи=Command.Execute();
    Исключение
        Сообщить("Ошибка при выполнении запроса!"+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
        Возврат ТЗ;
    КонецПопытки;
 
    Для НомерПоля = 0 По Записи.Fields.Count-1 Цикл
        СтрКолонка = Строка(Записи.Fields.Item(НомерПоля).Name);
        СтрКолонка = СтрЗаменить(СтрКолонка,"№","Num");
        НедопустимыеСимволы = " ~`!@""#№$;%^:&?*()-+=/\|.,";
        Для i = 1 По СтрДлина(НедопустимыеСимволы) Цикл
            СтрКолонка = СтрЗаменить(СтрКолонка, Mid(НедопустимыеСимволы, i, 1), "_")
        КонецЦикла;
        ИмяКолонки = СокрЛП(СтрКолонка);
        ТЗ.Колонки.Добавить(ИмяКолонки, , СтрКолонка);
    КонецЦикла;
 
    Пока НЕ Записи.EOF() Цикл
        НоваяСтрока = ТЗ.Добавить();
        Для НомерПоля = 0 По Записи.Fields.Count-1 Цикл
            НоваяСтрока[НомерПоля] = Записи.Fields(Записи.Fields.Item(НомерПоля).Name).Value;
        КонецЦикла;
        Записи.MoveNext();
    КонецЦикла;
 
    Command = Неопределено;
    Записи  = Неопределено;
 
    Возврат ТЗ;
 
КонецФункции
Подскажите хороший проверенный механизм чтения.
Ответ:
Код 1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Функция получает данные из файла Excel
//
// Параметры:
//   пФайл     - Имя файла
//   пЛист     - Имя листа с данными
//   СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
//                      если не задано, созадутся колонки вида "К1", "К2"
//   XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
//   ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
 
    #Если Клиент Тогда
    Состояние("Открытие Excel");
    #КонецЕсли
 
    Если XLSОбъект = Неопределено Тогда
        XLSОбъект = Новый COMОбъект("Excel.Application");
        XLSОбъект.Visible       = Ложь;
        XLSОбъект.DisplayAlerts = Ложь;
    КонецЕсли;
 
    Попытка
        Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат Неопределено;
    КонецПопытки;
 
    Лист = Book.Sheets(1);
    КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
    КолвоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
 
    Таблица = Новый ТаблицаЗначений;
 
    Если СтруктураКолонок = Неопределено Тогда
 
        Для Счетчик = 1 По КолвоКолонок Цикл
            Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
        КонецЦикла;
 
    Иначе
 
        МаксимальныйНомерКолонки = 0;
        Для каждого КлючИЗначение Из СтруктураКолонок Цикл
            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
            МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
        КонецЦикла;
 
        КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);
 
    КонецЕсли;
 
    НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
    КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
    КонСтрока = Мин(КонСтрока, КолвоСтрок);
 
    // Массив типа COMSafeArray
    Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
    КолвоСтрок   = Массив.GetUpperBound(1);
 
    Для НомерСтроки = 1 По КолвоСтрок Цикл
 
        #Если Клиент Тогда
        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
        ОбработкаПрерыванияПользователя();
        #КонецЕсли
 
        НоваяСтрока = Таблица.Добавить();
 
        Если СтруктураКолонок = Неопределено Тогда
 
            Для НомерКолонки = 1 По КолвоКолонок Цикл
 
                НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);
 
            КонецЦикла;
 
        Иначе
 
            Для каждого КлючИЗначение Из СтруктураКолонок Цикл
 
                НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);
 
            КонецЦикла;
 
        КонецЕсли;
 
    КонецЦикла;
 
    XLSОбъект.Application.Quit();
    Возврат Таблица;
 
КонецФункции
Так работает лучше, хоть и приходится передавать туда имя листа и структуру колонок и начальная строка не работает. Времени переделать нету...
Вопрос: Как сделать сводную таблицу с дополнительными полями построителем отчетом?

Есть таблица значений с полями: Родитель, Обозначение, Узел, Количество. Как сделать таблицу вида:

Причем Обозначение не измерение, а просто дополнительное поле, а измерения только Родитель и Узел.

Пока удалось Просто тупо таблицу из 2-х измерений, а как приляпать дополнительное поле не знаю. На всех форумах писал все молчат.
Ответ:
хм.. а в чём проблема?
Вы таблицу значений создаёте программно?
1) Добавляете в таблицу значений первые две колонки "Родитель, Обозначение", потом циклом добавляете колонки с узлами.
2) Заполняете таблицу, я так понимаю вы знаете измерения Родитель и Узел и значение которое необходимо записать? Тогда
Код:
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Добавить("Родитель",ЗначениеРодитель);
МассивСтрок = ТЗ.НайтиСтроки(СтруктураОтбора);

Для Каждого СтрокаТЗ из МассивСтрок Цикл
СтрокаТЗ.Установить(ИндексКолонки, ЗначениеКол);
КонецЦикла;
В грубом приближение так..

Сейчас прочитал заголовок ... а зачем построителем?
Вопрос: Программно удалить строку из таблицы word с объединенными ячейками

Как из 1С программно удалить строку из таблицы word с объединенными ячейками?

Сформирован файл, в нем есть таблица. 1-я и 2-я строчки обычные, дальше с 3-ей строки идут строки с объединенными по вертикали ячейками. При попытке удалить ВТОРУЮ строку (без объединенных ячеек) выпадает такая ошибка:
{Форма.Форма.Форма()}: Ошибка при вызове метода контекста (Rows)
    Таблица.Rows().Delete();
по причине:
Произошла исключительная ситуация (Microsoft Word): Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали.

При том, что если все аналогично формировать, но создавать строки БЕЗ объединенных ячеек, то этот метод без проблем отрабатывает ровно в том же виде.
Ответ: () Решение найдено!

ДокументВорд.Range(Таблица.Cell(2, 1).Range.Start, Таблица.Cell(2, 8).Range.End).Cells.Delete();

Всем спасибо :)
Вопрос: Работа с таблицей значений

Доброго Вам дня, уважаемые программисты. Прошу помощи в решении задачи в 1С, сама, извините, в этом не бум-бум
Пыталась сделать сама, но даже не хватило ума скомпилировать пример

1. В форму диалога поместите таблицу значений.
2. В модуле формы опишите колонки таблицы: Товар, Количество, Цена, Сумма.
3. Поместите на форму диалога реквизиты диалога "Товар", "Цена", "Коли¬чество" и кнопку Добавить строку, которая добавляет новую строку в таблицу значений и заполняет ее значениями соответствующих реквизи¬тов. Сумма должна вычисляться как произведение цены на количество.
4. Добавьте кнопку Удалить строку, которая удаляет текущую строку таб¬лицы значений. Предусмотрите ситуацию пустой таблицы значений.
5. Добавьте кнопку Свернуть, которая должна суммировать по товарам сумму и количество, в колонке Цена должна вычисляться средняя цена товара.
6. Добавьте кнопку Развернуть, которая восстанавливает состояние табли¬цы значений до свертки.
7. Добавьте кнопку Сортировка для упорядочивания строк по товарам.


Заранее спасибо!
Ответ: платформа? Управляемый или обычный режим?
В синт.поме "Таблица значений"
Вопрос: Математика в 7.7 в Таблицу выводится округленное значение. Где округляется ?

Еще раз всем с пятницей из дворницкой.

Помогите раскурить, где округляется ?

Имеем в таблице печатной формы

Знач1 59.95
Знач2 154.000

в модуле эти два значения перемножаются
а в таблице имею
Знач3 9233

Хотя на калькуляторе 9232,3
Как так то ? о_О

Наведите на мысль. Спасибо.
Ответ:
(12) точно
ИспользоватьФормат(<?>);
Синтаксис:
ИспользоватьФормат(<СтрокаФормата>)
Назначение:
Устанавливает формат по умолчанию для вывода выражений секций таблицы. Возвращает: строковое значение, содержащее текущую форматную строку по умолчанию для таблицы (на момент до исполнения метода).
Параметры:
<СтрокаФормата> - необязательный параметр. Строковое выражение, содержащее форматную строку (см. метод Формат).
Замечание:
В ячейках таблицы, при выводе которых требуется формат, отличный от установленного данным методом, должен быть установлен формат явным образом. Форматная строка записывается через символ ''#'' после выражения, заданного для ячейки. Если выражение, заданное для ячейки просто завершается символом ''#'',  то будет использоваться системный формат по умолчанию.