Мы с вами сталкиваемся с достаточно распространенной ситуацией в 1С:Предприятие, когда после внесения изменений в печатную форму, будь то программно или через пользовательские настройки, результат не всегда сразу виден. Это может вызывать недоумение и трату времени на поиск причин. Давайте вместе разберем, почему так происходит и какие шаги мы можем предпринять для решения этой проблемы. Мы рассмотрим различные аспекты: от пользовательских настроек до глубоких механизмов платформы и конфигурации.
Проблема некорректного отображения изменений в печатных формах чаще всего кроется в нескольких ключевых областях. Это могут быть пользовательские макеты, которые перекрывают стандартные, кэш системы, хранящий устаревшие данные, или особенности работы Системы Компоновки Данных (СКД). Начнем с наиболее частых причин и перейдем к более сложным.
Одной из наиболее частых причин, по которой изменения в печатной форме не отображаются, является наличие пользовательских макетов. Многие типовые конфигурации 1С позволяют пользователям самостоятельно изменять стандартные макеты без необходимости модификации самой конфигурации. Если такой макет был создан ранее, он будет иметь приоритет над любыми изменениями, внесенными в стандартный макет или программно.
Выясняем наличие пользовательских макетов:
Для начала, нам необходимо проверить, не был ли создан пользовательский макет для нашей печатной формы. Мы можем это сделать в пользовательском режиме, перейдя в раздел "Администрирование", затем "Печатные формы, отчеты и обработки" и выбрав пункт "Макеты печатных форм". В этом списке мы увидим все измененные пользовательские макеты. Найдите печатную форму, с которой возникла проблема.
Работа с пользовательским макетом:
Если мы обнаружили пользовательский макет, у нас есть несколько вариантов действий:
Изменить существующий пользовательский макет: Мы можем открыть его и внести необходимые корректировки. Важно помнить: при изменении макета через пользовательский интерфейс, мы должны быть очень осторожны и не изменять имена областей и параметров в макете, так как это может нарушить его работоспособность и логику формирования данных.
Вернуться к стандартному макету: Если мы хотим, чтобы система использовала стандартный макет (например, после обновления конфигурации или программных доработок), мы можем удалить пользовательский макет или сбросить его до стандартного. Как правило, в форме списка макетов есть кнопка или контекстное меню для этих действий.
Использовать предопределенные настройки: Некоторые печатные формы имеют предопределенные настройки для добавления или скрытия колонок (например, артикула или кода товара), которые можно настроить в параметрах учета или настройках печати документов. Прежде чем прибегать к изменению макетов, мы всегда должны проверять эти настройки.
Если проблема не в пользовательских макетах, следующим шагом мы должны обратить внимание на кэш системы и, в частности, на специализированный регистр сведений, который может выступать в роли "кэша" для макетов.
Роль регистра сведений МакетыКомпоновкиДанных:
Как мы выяснили, в некоторых конфигурациях (например, ЗУП), регистр сведений РегистрСведений.МакетыКомпоновкиДанных может использоваться для хранения макетов печатных форм или макетов СКД. По сути, он выступает в роли кэша, позволяя системе быстрее получать доступ к измененным или пользовательским макетам без необходимости обращения к основному хранилищу конфигурации. Если этот регистр содержит устаревшие данные, наши изменения не будут отображаться.
Мы можем получить доступ к этому регистру через интерфейс, если он доступен в меню, или напрямую, используя строку навигации в браузере (для веб-клиента) или в окне "Все функции" (в толстом клиенте), набрав e1cib/list/РегистрСведений.МакетыКомпоновкиДанных.
Очистка регистра МакетыКомпоновкиДанных:
Если мы обнаружили, что этот регистр используется, его очистка может помочь. Мы можем очистить его программно или вручную (если записей немного). Программная очистка выглядит следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МакетыКомпоновкиДанных.Ссылка КАК Ссылка
|ИЗ
| РегистрСведений.МакетыКомпоновкиДанных КАК МакетыКомпоновкиДанных";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Для каждой записи можно получить объект записи и удалить его.
// Однако, для полной очистки регистра, часто достаточно удалить все записи.
// Если регистр периодический или имеет измерения,
// более корректно будет удалять по конкретным измерениям, если это возможно.
// В простейшем случае, если это чистый кэш, можно удалить все записи.
// Внимание: Перед выполнением убедитесь, что это не приведет к нежелательным последствиям!
// Например, можно использовать менеджер записи регистра.
// МенеджерЗаписи = РегистрыСведений.МакетыКомпоновкиДанных.СоздатьМенеджерЗаписи();
// МенеджерЗаписи.Ссылка = Выборка.Ссылка;
// МенеджерЗаписи.Удалить(); // Это удалит запись по ссылке.
// Или более простой способ для очистки всех записей:
РегистрыСведений.МакетыКомпоновкиДанных.Очистить(); // Этот метод очищает весь регистр
Прервать; // Выходим после первой же очистки, если нам нужно очистить весь регистр.
КонецЦикла;
Обратите внимание: метод РегистрыСведений.МакетыКомпоновкиДанных.Очистить(); полностью очищает весь регистр. Мы должны использовать его с осторожностью, убедившись, что это не приведет к потере важных данных, если регистр используется не только как кэш, но и для хранения уникальных пользовательских макетов.
Общая очистка кэша 1С:
Помимо специализированных регистров, 1С активно использует кэш для ускорения работы. Проблемы с общим кэшем могут проявляться в виде некорректного поведения программы. Мы можем очистить его несколькими способами:
Параметр запуска \ClearCache: Это самый простой и безопасный способ. При запуске 1С:Предприятия через лаунчер, мы можем добавить дополнительный параметр запуска \ClearCache. При следующем запуске 1С автоматически очистит кэш для этой базы.
Ручное удаление файлов кэша: Временные файлы кэша хранятся в папках профиля пользователя. Мы можем найти их по путям, похожим на C:\Users\username\AppData\Roaming\1C\1Cv8 или C:\Users\username\AppData\Local\1C\1Cv8. В этих папках мы увидим каталоги с длинными, непонятными названиями (GUID), которые представляют собой кэш информационных баз. Мы можем удалить эти каталоги. Перед этим обязательно выйдите из всех информационных баз 1С.
Удаление базы из списка и повторное добавление: Этот метод менее полный, но иногда помогает. Мы удаляем базу из списка в лаунчере 1С и затем добавляем ее снова.
После очистки кэша, первый запуск информационной базы может занять немного больше времени, так как системе потребуется заново создать временные файлы.
Если нам требуется изменить не только внешний вид макета, но и логику получения данных, которые выводятся в печатную форму, мы переходим к программным доработкам. Этот подход предполагает изменение кода конфигурации.
Метод СформироватьПечатнуюФорму():
В большинстве объектов 1С (документы, справочники), которые имеют печатные формы, логика формирования этих форм сосредоточена в процедуре, обычно называемой СформироватьПечатнуюФорму(). Эта процедура находится в модуле менеджера объекта. Мы должны найти соответствующий модуль менеджера для нашего объекта и внести изменения туда.
Что мы можем изменить:
В этой процедуре мы можем:
Изменить запросы для получения данных.
Добавить или изменить алгоритмы обработки данных.
Управлять выводом данных в ТабличныйДокумент, используя макеты и области.
Мы должны быть внимательны при изменении типового кода, так как это может усложнить будущие обновления конфигурации.
Для более значительных изменений, или если мы хотим сохранить типовую конфигурацию без изменений, оптимальным решением является создание внешней печатной формы. Это отдельный файл с расширением .epf, который подключается к системе.
Преимущества внешних печатных форм:
Сохранение типовой конфигурации: Мы можем реализовать любую логику, не затрагивая основные объекты.
Простота обновления: Внешние формы не мешают обновлению конфигурации.
Гибкость: Мы можем использовать внешние печатные формы для решения самых сложных задач.
Процесс создания:
Создание внешней печатной формы включает следующие шаги:
Создание новой обработки в конфигураторе.
Разработка макета печатной формы (или использование СКД).
Написание кода для формирования формы, который обычно реализуется в экспортной процедуре Печать().
Сохранение обработки как внешней печатной формы (файл .epf).
Регистрация этой обработки в пользовательских настройках 1С (раздел "Администрирование" -> "Печатные формы, отчеты и обработки" -> "Дополнительные отчеты и обработки").
Многие современные печатные формы и отчеты в 1С построены на базе СКД. Если наша печатная форма использует СКД, нам необходимо убедиться, что все настройки в ней корректны.
Проверка элементов СКД:
Если печатная форма основана на СКД, мы должны проверить следующие элементы:
Наборы данных: Убедитесь, что запросы в наборах данных корректно выбирают необходимые поля и не содержат ошибок.
Параметры СКД: Проверьте, правильно ли устанавливаются значения параметров, передаваемых в СКД.
Настройки компоновки: В вариантах отчета или схеме компоновки данных проверьте, выбраны ли нужные поля для вывода, правильно ли настроены группировки, сортировки и условное оформление.
Иногда достаточно просто зайти в настройки отчета (или печатной формы, если она имеет настройки СКД) и пересохранить вариант отчета, чтобы обновить его кэшированные настройки.
Программное формирование печатной формы с использованием СКД:
Если мы формируем печатную форму программно на основе СКД, мы должны следовать определенному алгоритму:
Функция СформироватьПечатнуюФормуСКД(ДанныеДляФормирования) Экспорт
// 1. Получаем макет СКД из хранилища (например, из макета обработки или объекта)
МакетСКД = ПолучитьМакет("МакетКомпоновкиДанных");
// 2. Создаем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(МакетСКД));
КомпоновщикНастроек.ЗагрузитьНастройки(МакетСКД.НастройкиПоУмолчанию);
// 3. Устанавливаем значения параметров
// Пример:
// КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаНачала", НачалоДня(ТекущаяДата()));
// КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОкончания", КонецДня(ТекущаяДата()));
// 4. Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД, КомпоновщикНастроек.Настройки, , Тип("ТабличныйДокумент"));
// 5. Создаем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеДляФормирования);
// 6. Создаем процессор вывода результата
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
// 7. Выполняем вывод
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Возврат ТабличныйДокумент;
КонецФункции
Этот пример показывает общий подход. В конфигурациях, таких как ЗУП 3.1, для получения кадровых данных через запросы СКД могут использоваться специальные механизмы "Представлений", которые требуют инициализации отчета в процедуре ПриКомпоновкеРезультата и соответствующего описания таблиц "Представлений" в запросе СКД.
Мы рассмотрели основные причины, по которым изменения в печатных формах могут не отображаться, и предложили комплексные решения. Начиная с проверки пользовательских макетов и заканчивая работой с кэшем и СКД, мы можем поэтапно диагностировать и устранить проблему. Всегда начинайте с самых простых и очевидных шагов, постепенно переходя к более сложным программным решениям.