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

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Метод 1: Передача контекста формы через ОткрытьФорму

Этот способ считается наиболее корректным и производительным, так как он обеспечивает прямую связь между формами. Идея заключается в том, чтобы передать контекст родительской формы в открываемую форму подчиненного справочника. Проанализируем реализацию по шагам.

Шаг 1. Изменение вызова в форме родителя (Контрагенты)

При нажатии на кнопку добавления договора или открытии формы договора, мы должны передать зарезервированное слово Контекст в качестве параметра функции ОткрытьФорму.


// В модуле формы справочника Контрагенты
Процедура НовыйДоговор()
    // Передаем текущий контекст формы параметром
    ОткрытьФорму("Справочник.Договоры", Контекст);
КонецПроцедуры

Шаг 2. Прием контекста в форме договора

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


Перем КонтРодителя;

Процедура ПриОткрытии()
    // Проверяем, передан ли параметр
    Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
        // Если передавали список параметров, извлекаем нужный
    ИначеЕсли ТипЗначенияСтр(Форма.Параметр) = "ГрупповойКонтекст" Тогда
        КонтРодителя = Форма.Параметр;
    КонецЕсли;
КонецПроцедуры

Шаг 3. Вызов процедуры обновления при записи

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


Процедура ПриЗаписи()
    // Выполняем стандартную запись
    // ... 
    
    // Если контекст родителя был передан, вызываем процедуру обновления
    Если ПустоеЗначение(КонтРодителя) = 0 Тогда
        Попытка
            // ТаблицаДоговоров() должна быть объявлена с ключевым словом Экспорт
            КонтРодителя.ТаблицаДоговоров();
        Исключение
            // Обработка исключения, если процедура не найдена
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Важно помнить, что процедура ТаблицаДоговоров в форме контрагента обязательно должна быть помечена как Экспорт, иначе контекстный вызов выдаст ошибку.

Метод 2: Использование ОбработкаОжидания

Если форма договора открывается не программно через ваш код, а стандартными средствами системы, или если вы хотите избежать жесткой связи между формами, можно использовать механизм ОбработкаОжидания. Это позволяет форме родителя периодически "опрашивать" состояние системы.

Рассмотрим алгоритм реализации через глобальный флаг:

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

Реализуем процедуру проверки в форме контрагента:


Процедура ПроверитьОбновление()
    Если глОбновитьДоговоры = 1 Тогда
        ТаблицаДоговоров(); // Обновляем данные
        глОбновитьДоговоры = 0; // Сбрасываем флаг
    КонецЕсли;
КонецПроцедуры

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

Метод 3: Использование внешних компонент (FormEx)

Для более продвинутой разработки в 1С 7.7 часто применяется компонента FormEx. Она позволяет реализовать событийную модель, похожую на ту, что появилась в 1С 8.x. С помощью метода Сервис.ВнешнееСобытие() можно отправить сигнал из подчиненной формы, который будет перехвачен в родительской форме через процедуру ПриВнешнемСобытии.

Проанализируем преимущества этого подхода:

Особенности работы в SQL-версии

Поскольку в вопросе упомянуто использование SQL-версии (ТиС 9.2), нужно учитывать нюансы кэширования транзакций. Иногда после выполнения команды Записать() данные попадают в SQL-таблицы, но индексы для выборки ВыбратьЭлементы() могут обновиться с минимальной задержкой.

Если при вызове ТаблицаДоговоров() новый элемент все равно не появляется, попробуйте добавить принудительное перечитывание данных. В 1С 7.7 для этого иногда используют временную смену фокуса или метод Форма.Обновить(0). Также убедитесь, что в процедуре ТаблицаДоговоров заново инициализируется запрос или цикл выборки, а не просто перерисовывается визуальная таблица значений.

Выясним, какой метод выбрать. Если вы полностью контролируете код конфигурации, Метод №1 (Контекст) является самым надежным и "чистым" с точки зрения использования ресурсов системы. Если же договоры могут создаваться из разных мест (включая обработки или списки), то Метод №2 (Флаг + ОбработкаОжидания) обеспечит гарантированное обновление без необходимости переписывать все вызовы форм.

← На главную