diamond АШ Tlg

Памятка разработчику: операции с таблицами в 1С (БСП, ERP, УТ)

Шпаргалка для уменьшения количества кода

Содержание

Основы

Разработчик 1С при работе с таблицами чаще всего сталкивается с тремя сущностями: ТаблицаЗначений (ТЗ), Табличная часть (ТЧ) и ДанныеФормыКоллекция (ДФК). Перепутать их может каждый, ниже приведена доступность ключевых методов этих объектов:

Метод объекта, описание На клиенте На сервере
ДФК ТЗ ТЧ ДФК
Найти() - поиск строки по значению в колонке - + + -
НайтиСтроки() - поиск нескольких строк по параметру + + + +
НайтиПоИдентификатору() - поиск строки по идентификатору + - - +
ПолучитьИдентификатор() - получить идентификатор строки + - - +
Выгрузить() - копировать в другой ТЗ - - + +
Скопировать() - копировать в другой ТЗ - + - -
ВыгрузитьКолонки() - создать пустую ТЗ с такими же колонками - - + -
СкопироватьКолонки() - создать пустую ТЗ с такими же колонками - + - -
ВыгрузитьКолонку() - выгрузить колонку в массив - + + -
Загрузить() - загрузить из другого ТЗ - - + +
ЗагрузитьКолонку() - загрузить колнку из массива - + + -
Свернуть() - свернуть с суммированием числовых колонок - + + -
ЗаполнитьЗначения() - заполнить значения колонок - + - -
ЗаполнитьКолонку() - заполнить значения колонок - + - -
Итог() - итог по числовой колонке + + + +
Сортировать() - сортировка таблицы + + + +
Количество() - количество строк в таблице + + + +

Объекты типа ТаблицаЗначений недоступны на клиенте, а Табличная часть объекта на форме транслируется как тип ДанныеФормыКоллекция, в том числе и на клиенте. Существуют и другие объекты программирования, по сути также являющиеся таблицами, например Движения документов, но в этой статье они не рассматриваются.

Как видно, методы объектов имеют как сходства так и различия. Некоторые различия обусловлены исторически в целях совместимости со старыми платформами, другие различаются по технологическим причинам - в первую очередь из-за того что на клиенте отсутствуют сложные типы данных.

Для облегчения работы с таблицами существуют модули в библиотеке БСП, а также имеются собственные библиотечные модули в типовых конфигурациях. Примеры ниже используют модуль ОбщегоНазначенияУТ, из конфигурации ERP (УТ).

Передача ТаблицыЗначений в клиентский контекст и обратно

Из-за того, что в клиентском контексте нет объекта ТаблицаЗначений, принято транслировать таблицу в массив структур:

// Туда
МассивСтруктур = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаЗначений);

// Обратно
ТаблицаЗначений = ОбщегоНазначенияУТ.МассивВТаблицуЗначений(МассивСтруктур);

Если требуется передавать клиенту только одну строку ТаблицыЗначений, тогда:

ДанныеСтрокиВСтруктуре = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаТЗ);

Описания типов

Если ТаблицаЗначений создается вручную, то описания типов колонок базовых типов можно брать из БСП:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Дата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.ДатаВремя));
ТЗ.Колонки.Добавить("Наименование", ОбщегоНазначения.ОписаниеТипаСтрока(50);
ТЗ.Колонки.Добавить("Сумма", ОбщегоНазначения.ОписаниеТипаЧисло(12, 2));
ТЗ.Колонки.Добавить("Ссылка", ОбщегоНазначения.ОписаниеТипаВсеСсылки());

Создание пустых Таблиц значений по образцу

Если требуется новая пустая ТаблицаЗначений по образу и подобию другой таблицы, то не нужно писать большую "простыню", как выше:

// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.ВыгрузитьКолонки();
ТЗ.Колонки.Удалить(0); // НомерСтроки

// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.СкопироватьКолонки();

// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить(Новый Массив);

Создание полной копии с данными из другой таблицы

// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.Выгрузить();
    
// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.Скопировать();
    
// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить();

Создание частичной копии с данными из другой таблицы

// Пример частичной копии с фильтром по организации и избранным полям
ПараметрыОтбора = Новый Структура("Организация", Организация);
ИзбранныеПоля = "Номенклатура,Цена,Количество,Сумма,Сторно";

// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.Выгрузить(
    ДокументОбъект.ВыходныеИзделия.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля
);
        
// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.Скопировать(
    ДругаяТЗ.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля
);
        
// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить(
    Объект.ВыходныеИзделия.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля
);

// Универсальный для ТЧ и ДанныеФормыКоллекция:
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
    ТаблицаИсточник,
    ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля
);

// Универсальный для ТЧ и ДанныеФормыКоллекция с переименованием колонки
// 'Сумма' в 'СуммаВРублях':
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
    ТаблицаИсточник,
    ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля,
    ,
    Новый Структура("Сумма", "СуммаВРублях")
);

// Универсальный для ТЧ и ДанныеФормыКоллекция с простановкой значения 'Истина'
// в поле 'Сторно' во всех строках:
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
    ТаблицаИсточник,
    ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
    ИзбранныеПоля,
    Новый Структура("Сторно", Истина)
);

Выгрузка уникальных значений колонки в массив

// Из ТаблицыЗначения и ДанныеФормыКоллекция:
УникальныеЗначения = ОбщегоНазначенияУТ.ВыгрузитьЗначенияКолонки(ТаблицаИсточник, ИмяКолонки);

// Из ТаблицыЗначения и ТЧ объекта:
УникальныеЗначения = ОбщегоНазначения.ВыгрузитьКолонку(Таблица, ИмяКолонки, Истина);

Дополнение таблицы строками из другой таблицы

// Для любых видов таблиц:
ОбщегоНазначения.ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник);

// Более продвинутый вариант, работает только с ТаблицейЗначений:
ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ТаблицаПриемник, ТаблицаИсточник);
ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ТаблицаПриемник, ТаблицаИсточник, СоответствиеПолей, ЗначенияПоУмолчанию);

Добавление строки в таблицу

// Для таблиц с количеством полей до 9
ОбщегоНазначенияУТ.ДобавитьЗапись(Таблица, ЗначПоле1, ЗначПоле2, ЗначПоле3 ... ЗначПоле9);

Удаление строк из ТаблицыЗначений

СтруктураПоиска = Новый Структура("Номенклатура,Сторно", Номенклатура,Истина);
ОбщегоНазначенияУТ.НайтиИУдалитьСтрокиТаблицыЗначений(Таблица, СтруктураПоиска);

// Удаление строк, не попавших в отбор:
ОбщегоНазначенияУТ.НайтиИУдалитьСтрокиТаблицыЗначений(Таблица, СтруктураПоиска, Ложь);

Сравнение двух Таблиц значений

// Возвращаемое значение:
//	Строка 			- если КолонкиДолжныСовпадать = Истина и колонки таблиц отличаются; возвращается описание отличий в колонках
//	ТаблицаЗначений - во всех остальных случаях; содержит только отличающиеся строки таблиц №1 и №2
//		состав колонок таблицы - общие колонки таблиц №1 и №2
//		служебная колонка "СчетчикСтрокСравниваемыхТаблиц" содержит число отличное от 0:
//			если счетчик > 0, то строка встречается в таблице №1 на указанное количество раз больше
//			если счетчик < 0, то строка встречается в таблице №2 на указанное количество раз больше
КолонкиДолжныСовпадать = Истина;
Результат = ОбщегоНазначенияУТ.СравнитьТаблицыЗначений(Таблица1, Таблица2, КолонкиДолжныСовпадать);

Свертка таблиц

Основной прикол в свертках таблиц это то, что при свертке из Таблицы значений будут удалены неперечисленные в первом аргументе процедуры Свернуть() колонки, а из ТЧ объекта колонки удалены быть не могут по понятной причине, поэтому для ТЧ их требуется перечислять все.

// Для ТЧ Объекта, суммирование всех числовых колонок;
КолонкиГруппировок = Неопределено; // исключаемые из суммирования колонки
ОбщегоНазначенияУТ.СвернутьТабличнуюЧасть(Объект, "Товары", КолонкиГруппировок);

// Для ТаблицыЗначений. Внимание! Все неперечисленные поля удаляются из ТЗ:
ИменаПолейДляГруппировки = "Номенклатура,Характеристика,Назначение,Склад";
ИменаПолейДляСуммирования = "Количество,КоличествоУпаковок";
ТЗ.Свернуть(ИменаПолейДляГруппировки, ИменаПолейДляСуммирования);

Выполнение запроса с параметрами и выгрузкой в Таблицу значений


ТЗ = ОбщегоНазначенияУТ.ЗапросВыполнитьВыгрузить(
    "ВЫБРАТЬ * ИЗ Справочник.ФизическиеЛица ГДЕ ПометкаУдаления=&ПометкаУдаления И ЭтоГруппа=&ЭтоГруппа",
    Новый Структура("ПометкаУдаления,ЭтоГруппа", Ложь, Ложь)
);    

Показать временную таблицу СУБД при отладке

ТЗ = ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(МенеджерВременныхТаблицИлиЗапрос, ИмяВременнойТаблицы);

Проставить идентификаторы строк в ТЧ объекта

Заполнение идентификаторов строк в документах