В процессе поддержки старых конфигураций на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с ситуацией, когда в пользовательском интерфейсе (например, в списке выбора печати) пункт меню присутствует, а при попытке найти соответствующий код в конфигураторе поисковик выдает нулевой результат. Особенно часто это случается с УПД (Универсальным передаточным документом), так как этот формат появился значительно позже прекращения активного развития платформы 7.7 и всегда внедрялся как внешняя доработка.
Разберем по шагам, как найти «исчезнувший» код и где могут скрываться функции печати в сильно модифицированных базах.
Первым делом проанализируем процедуру, которая отвечает за вывод списка печатных форм. В нашем примере это процедура ПечатьПоВыбору. Рассмотрим фрагмент кода, предоставленный в обсуждении:
СписокЗнПеч = СоздатьОбъект("СписокЗначений");
СписокЗнПеч.УдалитьВсе();
СписокЗнПеч.ДобавитьЗначение("Расходная накладная");
СписокЗнПеч.ДобавитьЗначение("ТТН");
СписокЗнПеч.ДобавитьЗначение("Счёт-фактура");
СписокЗнПеч.ДобавитьЗначение("Складская накладная");
СписокЗнПеч.ДобавитьЗначение("Торг12");
СписокЗнПеч.ДобавитьЗначение("ЕГАИС");
ЧтоПечатать = "";
Если СписокЗнПеч.ВыбратьЗначение(ЧтоПечатать, "Что печатать?",,,0) > 0 Тогда
Если ЧтоПечатать = "Расходная накладная" Тогда
// Вызов внешней формы через список параметров
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.ВставитьЗначение(1,"РасходнаяНакладная");
СписокПараметров.ВставитьЗначение(2,ТекущийДокумент());
ОткрытьФорму("Отчет",СписокПараметров,КаталогИБ() + "ERT\Сертификаты\ПечатьСертификатов.ert");
ИначеЕсли ЧтоПечатать = "Счёт-фактура" Тогда
// Аналогичный вызов для счет-фактуры
// ...
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию: в коде выше мы видим жесткое заполнение объекта СписокЗначений. Если пункта «УПД» в методах ДобавитьЗначение нет, но в режиме «Предприятие» пользователь его видит, значит, происходит одно из двух:
FormEx), которая подменяет пункты меню.Если визуальный поиск не дает результатов, воспользуемся самым надежным инструментом — отладчиком. Посмотрим, как это сделать правильно:
В появившемся окне замера мы увидим список всех процедур и функций, которые были выполнены. Обратите внимание на колонку «Объект». Если там указан внешний файл с расширением .ert, значит, логика печати вынесена во внешнюю обработку.
В 1С 7.7 существует стандартный механизм подключения внешних печатных форм, который часто не требует правки модуля самого документа. Проверим настройки в пользовательском режиме:
Перейдем в меню Сервис — Дополнительные возможности или Сервис — Регистрация внешних печатных форм (название зависит от конфигурации). Найдем в списке наш вид документа. Если для него зарегистрирована форма с названием «УПД», мы увидим путь к файлу на диске.
Обычно такие файлы хранятся в подкаталогах основной базы:
ExtForms\PrnFormsExtForms\ErtERT\Сертификаты (как в коде из примера)Иногда программисты «старой школы» использовали весьма экзотические способы хранения кода. Выясним причину, по которой поиск в конфигураторе не находит слово «УПД». Конфигуратор ищет только внутри файла 1cv7.md. Если код вынесен во внешние отчеты (.ert), поиск их не «увидит».
Воспользуемся сторонним файловым менеджером (например, Total Commander) или системным поиском Windows для поиска текста внутри файлов:
*.ert;*.md.Как показала практика обсуждения, проблема часто кроется в наследовании инфраструктуры от предыдущих разработчиков. Проанализируем сообщение автора: файлы нашлись в каталоге другой информационной базы. Это происходит, когда в коде прописываются пути, отличные от стандартного КаталогИБ().
Посмотрим на пример опасного кода:
// Пример того, как делать НЕ желательно
ПутьКФормам = "Z:\Common_1C_Files\External_Forms\";
ОткрытьФорму("Отчет", Параметры, ПутьКФормам + "UPD_v2.ert");
Если в вашей базе реализован подобный механизм «библиотеки форм», обязательно проверьте константы и справочники, где могут храниться пути к этим сетевым ресурсам.
Для того чтобы эффективно разобраться в структуре печати 1С 7.7, придерживайтесь следующих правил:
Конт. Во внешних печатных формах контекст документа передается через переменную Форма.Параметр или напрямую через Контекст. Это поможет понять, какие данные документ передает в УПД.Помните, что в эпоху 1С 7.7 жесткая привязка к именам пользователей (как упоминавшийся в теме ИмяПользователя() = "Антон") была частым способом разграничения прав «на коленке». Если вы не видите функционал, возможно, ваш текущий интерфейс или имя пользователя просто не попадают под условия видимости данного пункта меню.