Памятка разработчику: операции с таблицами в 1С (БСП, ERP, УТ)
Содержание
- Основы
- Передача ТаблицыЗначений в клиентский контекст и обратно
- Описания типов
- Создание пустых Таблиц значений по образцу
- Создание полной копии с данными из другой таблицы
- Создание частичной копии с данными из другой таблицы
- Выгрузка уникальных значений колонки в массив
- Дополнение таблицы строками из другой таблицы
- Добавление строки в таблицу
- Удаление строк из ТаблицыЗначений
- Сравнение двух Таблиц значений
- Свертка таблиц
- Выполнение запроса с параметрами и выгрузкой в Таблицу значений
- Показать временную таблицу СУБД при отладке
- Проставить идентификаторы строк в ТЧ объекта
Основы
Разработчик 1С при работе с таблицами чаще всего сталкивается с тремя сущностями: ТаблицаЗначений (ТЗ), Табличная часть (ТЧ) и ДанныеФормыКоллекция (ДФК). Перепутать их может каждый, ниже приведена доступность ключевых методов этих объектов:
Метод объекта, описание | На клиенте | На сервере | ||
---|---|---|---|---|
ДФК | ТЗ | ТЧ | ДФК | |
Найти() - поиск строки по значению в колонке | - | + | + | - |
НайтиСтроки() - поиск нескольких строк по параметру | + | + | + | + |
НайтиПоИдентификатору() - поиск строки по идентификатору | + | - | - | + |
ПолучитьИдентификатор() - получить идентификатор строки | + | - | - | + |
Выгрузить() - копировать в другой ТЗ | - | - | + | + |
Скопировать() - копировать в другой ТЗ | - | + | - | - |
ВыгрузитьКолонки() - создать пустую ТЗ с такими же колонками | - | - | + | - |
СкопироватьКолонки() - создать пустую ТЗ с такими же колонками | - | + | - | - |
ВыгрузитьКолонку() - выгрузить колонку в массив | - | + | + | - |
Загрузить() - загрузить из другого ТЗ | - | - | + | + |
ЗагрузитьКолонку() - загрузить колнку из массива | - | + | + | - |
Свернуть() - свернуть с суммированием числовых колонок | - | + | + | - |
ЗаполнитьЗначения() - заполнить значения колонок | - | + | - | - |
ЗаполнитьКолонку() - заполнить значения колонок | - | + | - | - |
Итог() - итог по числовой колонке | + | + | + | + |
Сортировать() - сортировка таблицы | + | + | + | + |
Количество() - количество строк в таблице | + | + | + | + |
Объекты типа ТаблицаЗначений недоступны на клиенте, а Табличная часть объекта на форме транслируется как тип ДанныеФормыКоллекция, в том числе и на клиенте. Существуют и другие объекты программирования, по сути также являющиеся таблицами, например Движения документов, но в этой статье они не рассматриваются.
Как видно, методы объектов имеют как сходства так и различия. Некоторые различия обусловлены исторически в целях совместимости со старыми платформами, другие различаются по технологическим причинам - в первую очередь из-за того что на клиенте отсутствуют сложные типы данных.
Для облегчения работы с таблицами существуют модули в библиотеке БСП, а также имеются собственные библиотечные модули в типовых конфигурациях. Примеры ниже используют модуль ОбщегоНазначенияУТ, из конфигурации ERP (УТ).
Передача ТаблицыЗначений в клиентский контекст и обратно
Из-за того, что в клиентском контексте нет объекта ТаблицаЗначений, принято транслировать таблицу в массив структур:
// Туда
МассивСтруктур = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаЗначений);
// Обратно
ТаблицаЗначений = ОбщегоНазначенияУТ.МассивВТаблицуЗначений(МассивСтруктур);
Если требуется передавать клиенту только одну строку ТаблицыЗначений, тогда:
ДанныеСтрокиВСтруктуре = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаТЗ);
Описания типов
Если ТаблицаЗначений создается вручную, то описания типов колонок базовых типов можно брать из БСП:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Дата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.ДатаВремя));
ТЗ.Колонки.Добавить("Наименование", ОбщегоНазначения.ОписаниеТипаСтрока(50);
ТЗ.Колонки.Добавить("Сумма", ОбщегоНазначения.ОписаниеТипаЧисло(12, 2));
ТЗ.Колонки.Добавить("Ссылка", ОбщегоНазначения.ОписаниеТипаВсеСсылки());
Создание пустых Таблиц значений по образцу
Если требуется новая пустая ТаблицаЗначений по образу и подобию другой таблицы, то не нужно писать большую "простыню", как выше:
// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.ВыгрузитьКолонки();
ТЗ.Колонки.Удалить(0); // НомерСтроки
// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.СкопироватьКолонки();
// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить(Новый Массив);
Создание полной копии с данными из другой таблицы
// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.Выгрузить();
// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.Скопировать();
// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить();
Создание частичной копии с данными из другой таблицы
// Пример частичной копии с фильтром по организации и избранным полям
ПараметрыОтбора = Новый Структура("Организация", Организация);
ИзбранныеПоля = "Номенклатура,Цена,Количество,Сумма,Сторно";
// Из ТЧ объекта конфигурации:
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ТЗ = ДокументОбъект.ВыходныеИзделия.Выгрузить(
ДокументОбъект.ВыходныеИзделия.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля
);
// Из другой ТаблицыЗначений:
ТЗ = ДругаяТЗ.Скопировать(
ДругаяТЗ.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля
);
// Из ДанныеФормыКоллекция:
ТЗ = Объект.ВыходныеИзделия.Выгрузить(
Объект.ВыходныеИзделия.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля
);
// Универсальный для ТЧ и ДанныеФормыКоллекция:
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
ТаблицаИсточник,
ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля
);
// Универсальный для ТЧ и ДанныеФормыКоллекция с переименованием колонки
// 'Сумма' в 'СуммаВРублях':
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
ТаблицаИсточник,
ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля,
,
Новый Структура("Сумма", "СуммаВРублях")
);
// Универсальный для ТЧ и ДанныеФормыКоллекция с простановкой значения 'Истина'
// в поле 'Сторно' во всех строках:
ТЗ = ОбщегоНазначенияУТ.ВыгрузитьТаблицуЗначений(
ТаблицаИсточник,
ТаблицаИсточник.НайтиСтроки(ПараметрыОтбора),
ИзбранныеПоля,
Новый Структура("Сторно", Истина)
);
Выгрузка уникальных значений колонки в массив
// Из ТаблицыЗначения и ДанныеФормыКоллекция:
УникальныеЗначения = ОбщегоНазначенияУТ.ВыгрузитьЗначенияКолонки(ТаблицаИсточник, ИмяКолонки);
// Из ТаблицыЗначения и ТЧ объекта:
УникальныеЗначения = ОбщегоНазначения.ВыгрузитьКолонку(Таблица, ИмяКолонки, Истина);
Дополнение таблицы строками из другой таблицы
// Для любых видов таблиц:
ОбщегоНазначения.ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник);
// Более продвинутый вариант, работает только с ТаблицейЗначений:
ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ТаблицаПриемник, ТаблицаИсточник);
ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ТаблицаПриемник, ТаблицаИсточник, СоответствиеПолей, ЗначенияПоУмолчанию);
Добавление строки в таблицу
// Для таблиц с количеством полей до 9
ОбщегоНазначенияУТ.ДобавитьЗапись(Таблица, ЗначПоле1, ЗначПоле2, ЗначПоле3 ... ЗначПоле9);
Удаление строк из ТаблицыЗначений
СтруктураПоиска = Новый Структура("Номенклатура,Сторно", Номенклатура,Истина);
ОбщегоНазначенияУТ.НайтиИУдалитьСтрокиТаблицыЗначений(Таблица, СтруктураПоиска);
// Удаление строк, не попавших в отбор:
ОбщегоНазначенияУТ.НайтиИУдалитьСтрокиТаблицыЗначений(Таблица, СтруктураПоиска, Ложь);
Сравнение двух Таблиц значений
// Возвращаемое значение:
// Строка - если КолонкиДолжныСовпадать = Истина и колонки таблиц отличаются; возвращается описание отличий в колонках
// ТаблицаЗначений - во всех остальных случаях; содержит только отличающиеся строки таблиц №1 и №2
// состав колонок таблицы - общие колонки таблиц №1 и №2
// служебная колонка "СчетчикСтрокСравниваемыхТаблиц" содержит число отличное от 0:
// если счетчик > 0, то строка встречается в таблице №1 на указанное количество раз больше
// если счетчик < 0, то строка встречается в таблице №2 на указанное количество раз больше
КолонкиДолжныСовпадать = Истина;
Результат = ОбщегоНазначенияУТ.СравнитьТаблицыЗначений(Таблица1, Таблица2, КолонкиДолжныСовпадать);
Свертка таблиц
Основной прикол в свертках таблиц это то, что при свертке из Таблицы значений будут удалены неперечисленные в первом аргументе процедуры Свернуть() колонки, а из ТЧ объекта колонки удалены быть не могут по понятной причине, поэтому для ТЧ их требуется перечислять все.
// Для ТЧ Объекта, суммирование всех числовых колонок;
КолонкиГруппировок = Неопределено; // исключаемые из суммирования колонки
ОбщегоНазначенияУТ.СвернутьТабличнуюЧасть(Объект, "Товары", КолонкиГруппировок);
// Для ТаблицыЗначений. Внимание! Все неперечисленные поля удаляются из ТЗ:
ИменаПолейДляГруппировки = "Номенклатура,Характеристика,Назначение,Склад";
ИменаПолейДляСуммирования = "Количество,КоличествоУпаковок";
ТЗ.Свернуть(ИменаПолейДляГруппировки, ИменаПолейДляСуммирования);
Выполнение запроса с параметрами и выгрузкой в Таблицу значений
ТЗ = ОбщегоНазначенияУТ.ЗапросВыполнитьВыгрузить(
"ВЫБРАТЬ * ИЗ Справочник.ФизическиеЛица ГДЕ ПометкаУдаления=&ПометкаУдаления И ЭтоГруппа=&ЭтоГруппа",
Новый Структура("ПометкаУдаления,ЭтоГруппа", Ложь, Ложь)
);
Показать временную таблицу СУБД при отладке
ТЗ = ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(МенеджерВременныхТаблицИлиЗапрос, ИмяВременнойТаблицы);