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

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

В работе с платформой 1С:Предприятие 7.7 программисты и пользователи часто сталкиваются с загадочным поведением системы: вы открываете справочник, меняете название номенклатуры (например, с «Булка 300г» на «Булка 350г»), сохраняете изменения и выбираете товар в документ, но в строке документа по-прежнему отображается старое название. Более того, при печати документа также может выводиться устаревшее наименование, хотя в самом справочнике данные уже верны. Разберем детально, почему это происходит и как победить кэширование системы.

Причина проблемы: Механизм кэширования представлений

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

Это представление «засыпает» в оперативной памяти формы документа. Пока не произойдет явного события, заставляющего систему перечитать объект (например, полная перезапись строки или перевыбор элемента), 1С будет подставлять строку из локального кэша сессии. Важно понимать, что Период опроса базы данных, который настраивается в параметрах системы, здесь не поможет — он отвечает за обновление списков (журналов), а не за актуализацию данных внутри уже открытых объектов.

Способ 1. Принудительное обновление через код формы

Если мы хотим, чтобы форма документа «увидела» изменения немедленно, самый простой способ — использовать метод Форма.Обновить(). Однако, как показывает практика, одного вызова метода может быть недостаточно для обновления всех строк табличной части. Рассмотрим, как это реализовать программно в процедуре печати или при выборе элемента.

Разберем пример кода, который можно добавить в модуль формы документа, чтобы актуализировать данные перед выводом на печать:


Процедура Печать()
    // Принудительно обновляем форму, чтобы подтянуть изменения из кэша
    Форма.Обновить(0); 
    
    // Для гарантии можно "встряхнуть" объект документа
    КонтекстДокумента = ТекущийДокумент();
    
    // Далее идет стандартный код формирования таблицы
    Таб = СоздатьОбъект("Таблица");
    // ... код печати ...
КонецПроцедуры

Использование Форма.Обновить() заставляет визуальные элементы перерисоваться, обращаясь к актуальным данным, хранящимся в ссылках. Значение 0 в параметрах метода означает обновление без пересчета итогов, что работает быстрее.

Способ 2. Актуализация через обращение к реквизиту ("Эффект неонки")

Существует проверенный временем «хакерский» метод в 1С 7.7. Чтобы заставить систему обновить кэшированный объект номенклатуры, нужно обратиться к любому его реквизиту через точку. В этот момент платформа понимает, что данных в кэше недостаточно, и выполняет реальный запрос к базе данных.

Проанализируем ситуацию: если в печатной форме или в коде обработки строки мы просто обращаемся к ТМЦ.Наименование, система может взять старую строку. Но если мы обратимся к другому реквизиту, например, к Коду или Полному наименованию, объект будет перечитан. Рассмотрим код для обновления всех строк табличной части:


ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    // Фиктивное обращение к реквизиту для сброса кэша объекта
    ВременнаяПеременная = ТМЦ.ПолнНаименование; 
    
    // Или даже так (переприсваивание ссылки самому себе):
    ТМЦ = ТМЦ;
КонецЦикла;

Строка ТМЦ = ТМЦ; внутри цикла по строкам документа творит чудеса: она заставляет систему заново идентифицировать ссылку и обновить ее строковое представление в экранной форме.

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

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

Внешняя печатная форма часто создает новый объект справочника для получения дополнительных данных:


СпрТМЦ = СоздатьОбъект("Справочник.Номенклатура");
Если СпрТМЦ.НайтиЭлемент(СсылкаИзДокумента) = 1 Тогда
    ПечатноеИмя = СпрТМЦ.Наименование; // Здесь всегда будет актуальное имя
КонецЕсли;

Поскольку СпрТМЦ — это новый объект СоздатьОбъект, он не знает ничего о кэше формы документа и идет прямым запросом в базу (DBF или SQL). Если вы столкнулись с тем, что наименования критически важно обновлять мгновенно, перевод печатных форм во внешние файлы — отличное решение.

Способ 4. Метод "Шаблон" для быстрого обновления

Существует еще один изящный способ принудительного обновления представлений без перебора всех строк в цикле. Мы можем использовать функцию Шаблон(). Это заставляет движок 1С 7.7 пересчитать выражения, связанные с объектами базы данных.

Например, вызов Шаблон("[ТМЦ.Наименование]") в контексте формы может инициировать обращение к актуальному состоянию объекта. Хотя этот метод реже используется для решения именно этой задачи, он помогает в сложных интерфейсных решениях, когда Форма.Обновить() не дает желаемого результата.

Особенности работы в DBF и RDP

Проанализируем влияние среды окружения. В DBF-версиях проблема усугубляется механизмами буферизации Windows. Когда один пользователь (или вы в другом окне) меняет файл справочника, операционная система не всегда мгновенно сообщает об этом другим процессам, читающим тот же файл. При работе через RDP (удаленный рабочий стол) может добавляться задержка отрисовки графики, когда данные в базе уже изменились, а картинка на экране — еще нет.

Резюмируем рекомендации:

  1. Если вы изменили товар, старайтесь перевыбрать его в документе (двойной клик или Enter в поле выбора). Это гарантированно обновит строку.
  2. В модуле документа перед печатью добавьте цикл актуализации строк через обращение к реквизиту или ТМЦ = ТМЦ;.
  3. Используйте Форма.Обновить(0); в предопределенных процедурах формы (например, ПриПовторномОткрытии или ПриЗаписи).
  4. Для критически важных документов (счета-фактуры, накладные) используйте внешние печатные формы, которые обращаются к справочникам через СоздатьОбъект.

Соблюдение этих правил позволит избежать путаницы с «Булками» разного веса и обеспечит соответствие печатных форм актуальным данным вашей базы 1С 7.7.

← На главную