Как программно записать и закрыть форму элемента справочника в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке и доработке конфигураций на платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей взаимодействия с открытыми формами элементов справочников. На практике возникают ситуации, когда требуется принудительно записать внесенные изменения и закрыть форму из кода модуля или корректно сохранить данные, находящиеся в элементах диалога.

Рассмотрим детально, как устроено хранение данных на форме, почему нельзя напрямую записать произвольный элемент диалога и какими способами можно программно сохранить и закрыть открытую форму элемента справочника.

Различие между реквизитами справочника и элементами диалога

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

Если требуется передать и сохранить данные элемента диалога между сеансами или при изменении других справочников, разберем два основных подхода:

  1. Сериализация данных в реквизит-строку: В справочнике создается реквизит типа Строка неограниченной длины (или достаточно большой длины). Перед записью данные списка переводятся в строку, а при открытии восстанавливаются обратно.
  2. Использование подчиненных справочников или внешних файлов: Для хранения сложных структур создаются подчиненные объекты информационной базы или данные записываются в системный буфер с помощью функций СохранитьЗначение() и ВосстановитьЗначение().

Рассмотрим пример реализации сохранения списка значений через сериализацию в строковый реквизит СтрДляСписка:


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

// В модуле формы Справочника2 в процедуре ПриОткрытии():
Если ПустаяСтрока(СтрДляСписка) = 0 Тогда
    // Восстанавливаем список значений из строки и присваиваем элементу диалога
    ЭлементДиалогаСписок = ЗначениеИзСтроки(СтрДляСписка);
КонецЕсли;

Программная запись и закрытие формы элемента

Выясним, как правильно выполнить запись и закрытие, если форма элемента справочника уже открыта на экране или открывается программно.

Прямой вызов команды Записать() непосредственно из формулы элемента диалога (например, из поля ввода при изменении) вызывает ошибку: «Данная команда не может выполняться в формуле элемента диалога!». Платформа блокирует такие действия во избежание рекурсивных вызовов в момент обработки события элемента управления.

Для программного сохранения и закрытия формы из кода модуля формы разберем несколько рабочих способов.

Способ 1. Использование встроенных методов формы

Посмотрим на применение штатных методов работы с контекстом формы Форма.ЗаписатьВФорме() и Форма.Закрыть():


Процедура СохранитьИЗакрытьФорму()
    // Записываем данные объекта, связанные с формой
    Форма.ЗаписатьВФорме();
    
    // Закрываем текущую форму
    Форма.Закрыть(0);
КонецПроцедуры

Способ 2. Переопределение строки действий формы

Если на форме присутствуют периодические реквизиты, при обычном вызове Записать() может не происходить сохранение периодических данных или не появляться штатное окно запроса даты. Чтобы запустить стандартный интерактивный механизм платформы (эквивалентный нажатию кнопки «ОК»), проанализируем использование системной переменной СтрокаДействийФормы.

Присвоение этой переменной специальной управляющей команды передает исполнение платформе:


Процедура ВыполнитьЗаписьИЗакрытие()
    // Эмулируем нажатие стандартной кнопки сохранения и закрытия формы
    СтрокаДействийФормы = "#Записать? Закрыть";
КонецПроцедуры

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

← На главную