В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей синхронизации данных между родительской и подчиненной формой. Типичный пример: из формы справочника Контрагенты открывается список или форма нового договора (подчиненный справочник Договоры). После записи нового договора пользователь ожидает увидеть его в списке на форме контрагента мгновенно, однако в 7.7 отсутствует привычный для восьмой версии механизм Оповестить. Разберем подробно, как решить эту проблему несколькими способами.
Этот способ считается наиболее корректным и производительным, так как он обеспечивает прямую связь между формами. Идея заключается в том, чтобы передать контекст родительской формы в открываемую форму подчиненного справочника. Проанализируем реализацию по шагам.
Шаг 1. Изменение вызова в форме родителя (Контрагенты)
При нажатии на кнопку добавления договора или открытии формы договора, мы должны передать зарезервированное слово Контекст в качестве параметра функции ОткрытьФорму.
// В модуле формы справочника Контрагенты
Процедура НовыйДоговор()
// Передаем текущий контекст формы параметром
ОткрытьФорму("Справочник.Договоры", Контекст);
КонецПроцедуры
Шаг 2. Прием контекста в форме договора
В модуле формы подчиненного справочника (Договоры) нам нужно сохранить полученный контекст в переменную, чтобы использовать его позже.
Перем КонтРодителя;
Процедура ПриОткрытии()
// Проверяем, передан ли параметр
Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
// Если передавали список параметров, извлекаем нужный
ИначеЕсли ТипЗначенияСтр(Форма.Параметр) = "ГрупповойКонтекст" Тогда
КонтРодителя = Форма.Параметр;
КонецЕсли;
КонецПроцедуры
Шаг 3. Вызов процедуры обновления при записи
Теперь в предопределенной процедуре ПриЗаписи мы можем обратиться к экспортной процедуре родительской формы, которая отвечает за перестроение таблицы договоров.
Процедура ПриЗаписи()
// Выполняем стандартную запись
// ...
// Если контекст родителя был передан, вызываем процедуру обновления
Если ПустоеЗначение(КонтРодителя) = 0 Тогда
Попытка
// ТаблицаДоговоров() должна быть объявлена с ключевым словом Экспорт
КонтРодителя.ТаблицаДоговоров();
Исключение
// Обработка исключения, если процедура не найдена
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Важно помнить, что процедура ТаблицаДоговоров в форме контрагента обязательно должна быть помечена как Экспорт, иначе контекстный вызов выдаст ошибку.
Если форма договора открывается не программно через ваш код, а стандартными средствами системы, или если вы хотите избежать жесткой связи между формами, можно использовать механизм ОбработкаОжидания. Это позволяет форме родителя периодически "опрашивать" состояние системы.
Рассмотрим алгоритм реализации через глобальный флаг:
Перем глОбновитьДоговоры Экспорт;ПриЗаписи установим значение: глОбновитьДоговоры = 1;ПриОткрытии запустим мониторинг: Форма.ОбработкаОжидания("ПроверитьОбновление", 1); (проверка каждую секунду).Реализуем процедуру проверки в форме контрагента:
Процедура ПроверитьОбновление()
Если глОбновитьДоговоры = 1 Тогда
ТаблицаДоговоров(); // Обновляем данные
глОбновитьДоговоры = 0; // Сбрасываем флаг
КонецЕсли;
КонецПроцедуры
Этот метод удобен тем, что он сработает, даже если пользователь открыл несколько разных договоров. Однако стоит учитывать, что частое выполнение ОбработкаОжидания может незначительно нагружать интерфейс, поэтому интервал в 1-2 секунды является оптимальным.
Для более продвинутой разработки в 1С 7.7 часто применяется компонента FormEx. Она позволяет реализовать событийную модель, похожую на ту, что появилась в 1С 8.x. С помощью метода Сервис.ВнешнееСобытие() можно отправить сигнал из подчиненной формы, который будет перехвачен в родительской форме через процедуру ПриВнешнемСобытии.
Проанализируем преимущества этого подхода:
ГрупповойКонтекст и заботиться о его актуальности.Поскольку в вопросе упомянуто использование SQL-версии (ТиС 9.2), нужно учитывать нюансы кэширования транзакций. Иногда после выполнения команды Записать() данные попадают в SQL-таблицы, но индексы для выборки ВыбратьЭлементы() могут обновиться с минимальной задержкой.
Если при вызове ТаблицаДоговоров() новый элемент все равно не появляется, попробуйте добавить принудительное перечитывание данных. В 1С 7.7 для этого иногда используют временную смену фокуса или метод Форма.Обновить(0). Также убедитесь, что в процедуре ТаблицаДоговоров заново инициализируется запрос или цикл выборки, а не просто перерисовывается визуальная таблица значений.
Выясним, какой метод выбрать. Если вы полностью контролируете код конфигурации, Метод №1 (Контекст) является самым надежным и "чистым" с точки зрения использования ресурсов системы. Если же договоры могут создаваться из разных мест (включая обработки или списки), то Метод №2 (Флаг + ОбработкаОжидания) обеспечит гарантированное обновление без необходимости переписывать все вызовы форм.