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