При разработке внешних печатных форм (ВПФ) и дополнительных обработок в платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда данные, выбранные на форме обработки, не передаются в результирующую ТаблицуЗначений или печатную форму, возвращая пустые значения. Разберем детально, почему это происходит и как правильно организовать хранение и передачу настроек сопоставления данных.
Проанализируем типичный сценарий: на форме внешней обработки размещены элементы управления типа СписокЗначений (например, для сопоставления мест хранения и ответственных сотрудников). При интерактивном открытии формы значения видны, однако при вызове обработки по кнопке «Печать» из документа формируются пустые строки. Выясним главные причины такого поведения:
СписокЗначений представляет собой коллекцию (множество) элементов. При прямой попытке присвоить список переменной строкового типа (Приемник = СписокЗначений;) платформа не может выполнить автоматическое преобразование коллекции в скалярное значение.НоваяКолонка() ожидает во втором параметре базовый тип (например, "Строка", "Число") или вид объекта конфигурации ("Справочник.Сотрудники"). Конструкция вида "Справочник.МестаХранения.Наименование" является синтаксически неверной.Если требуется один раз настроить соответствие реквизитов (например, складов и ответственных лиц), а затем использовать эти данные при фоновой печати документа, оптимальным решением является использование системных функций СохранитьЗначение и ВосстановитьЗначение.
Разберем реализацию по шагам:
Посмотрим на пример кода сохранения настроек в модуле формы обработки:
Процедура ПриЗакрытии()
// Сохраняем значения переменных или списков в системную базу настроек
СохранитьЗначение("Настройка_МестоХранения_1", МестоХр1);
СохранитьЗначение("Настройка_Сотрудник_1", сСотр1);
КонецПроцедуры
Теперь рассмотрим, как восстановить сохраненные данные непосредственно в процедуре формирования печатной формы (бухгалтерской справки):
Процедура Печать(Докум)
Перем ВыбМестоХр1, ВыбСотр1;
// Восстанавливаем сохраненные соответствия
ВосстановитьЗначение("Настройка_МестоХранения_1", ВыбМестоХр1);
ВосстановитьЗначение("Настройка_Сотрудник_1", ВыбСотр1);
// Используем полученные значения для сопоставления данных документа
Если Докум.Склад = ВыбМестоХр1 Тогда
Ответственный = ВыбСотр1;
КонецЕсли;
КонецПроцедуры
Если обработка используется в интерактивном режиме с открытой формой, важно правильно извлекать выбранные значения из элементов управления СписокЗначений и заполнять ими ТаблицуЗначений.
Чтобы получить текущий выбранный элемент из списка значений на форме, используем метод ПолучитьЗначение() вместе со свойством ТекущаяСтрока:
// Получаем выбранное значение из СпискаЗначений на активной форме
Если СписокСотрудников.ТекущаяСтрока() > 0 Тогда
ВыбранныйСотрудник = СписокСотрудников.ПолучитьЗначение(СписокСотрудников.ТекущаяСтрока());
КонецЕсли;
Рассмотрим, как правильно создать и заполнить ТаблицуЗначений полученными данными со ссылочной типизацией или без жесткого ограничения типов:
Функция СформироватьТаблицуСоответствий()
ТЗ = СоздатьОбъект("ТаблицаЗначений");
// Способ 1: Явное указание ссылочного типа
ТЗ.НоваяКолонка("МестоХранения", "Справочник.МестаХранения");
ТЗ.НоваяКолонка("Сотрудник", "Справочник.Сотрудники");
// Способ 2: Нетипизированные колонки (принимают любые типы)
// ТЗ.НоваяКолонка("МестоХранения");
// ТЗ.НоваяКолонка("Сотрудник");
// Заполняем строку таблицы
ТЗ.НоваяСтрока();
ТЗ.МестоХранения = МестоХр1;
ТЗ.Сотрудник = сСотр1;
Возврат ТЗ;
КонецФункции
Поиск соответствия по сформированной таблице значений выполняется стандартными методами платформы:
НомСтр = 0;
Если ТЗ.НайтиЗначение(ТекущийСклад, НомСтр, "МестоХранения") = 1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(НомСтр);
ОтветственныйСотрудник = ТЗ.Сотрудник;
КонецЕсли;
В случаях, когда настройки соответствий должны быть общими для нескольких пользователей или переноситься между базами данных, рассмотрим вариант сериализации данных в файл.
Для сохранения и загрузки произвольных структур данных (списков или таблиц значений) используем встроенные методы ЗначениеВФайл и ЗначениеИзФайла:
// Сохранение таблицы соответствий в файл
ЗначениеВФайл(КаталогИБ() + "sklad_mol.dat", ТЗ);
// Чтение таблицы соответствий при формировании печатной формы
ТЗ_Загруженная = СоздатьОбъект("ТаблицаЗначений");
ЗначениеИзФайла(КаталогИБ() + "sklad_mol.dat", ТЗ_Загруженная);
Такой подход полностью изолирует логику формирования печатной формы от интерфейсной части обработки и гарантирует корректное заполнение реквизитов при вызове из любого документа.