При работе с платформой 1С 7.7 программисты часто сталкиваются с тем, что стандартные средства настройки журналов не позволяют напрямую выбрать реквизиты объекта Операция. Это вызывает определенные трудности, особенно в сложных конфигурациях вроде «Производство + Услуги + Бухгалтерия» (ПУБ), где бухгалтерские проводки и данные операции играют ключевую роль. В рамках этой статьи мы подробно разберем, почему возникает такая сложность, и изучим механизмы, позволяющие вывести нужные данные в список документов.
Для начала проанализируем ситуацию: почему в конфигураторе при настройке граф журнала мы видим список обычных документов, но не можем «дотянуться» до реквизитов операции? Дело в архитектуре 1С 7.7. Объект Операция является уникальным. Он существует в двух ипостасях одновременно: как оболочка документа (имеет номер и дату) и как специализированный объект метаданных, содержащий в себе проводки и дополнительные реквизиты. В дереве конфигурации вы можете заметить, что Операция присутствует и в ветке «Документы», и как самостоятельный узел. Конструктор граф журнала ориентирован на работу с общими реквизитами документов, поэтому специфические данные бухгалтерской операции остаются «за бортом» стандартного интерфейса.
Рассмотрим наиболее надежный и проверенный способ решения этой задачи — использование программной функции в формуле графы журнала. Разберем этот процесс по шагам:
глПолучитьРеквизитОперации(ТекущийДокумент).Теперь перейдем к программной части. Нам необходимо реализовать алгоритм, который будет определять вид документа в каждой строке и, если это операция, извлекать из нее данные. Посмотрим на пример кода, который следует разместить в модуле формы журнала:
Функция глПолучитьРеквизитОперации(Док)
// Проверим, выбран ли документ в строке
Если Док.Выбран() = 0 Тогда
Возврат "";
КонецЕсли;
// Проверяем вид документа.
// В 1С 7.7 операция может быть как отдельным видом документа,
// так и существовать у других документов (например, в ПУБ или Бухгалтерии)
Если Док.Вид() = "Операция" Тогда
// Обращаемся напрямую к объекту Операция через контекст документа
Возврат Док.Операция.Содержание;
Иначе
// У некоторых документов может не быть операции (например, справочные документы-договоры)
// Поэтому используем попытку или проверку наличия операции
Попытка
Если Док.Операция.Выбран() = 1 Тогда
Возврат Док.Операция.Содержание;
КонецЕсли;
Исключение
Возврат "";
КонецПопытки;
EndЕсли;
Возврат "";
КонецФункции
Проанализируем ситуацию применительно к конфигурации «Производство + Услуги + Бухгалтерия». В ПУБ существует особенность: многие документы (например, «Поступление ТМЦ» или «Реализация») делают движения не только по бухгалтерским счетам, но и по оперативным регистрам. Важно помнить, что объект Операция в этой конфигурации отвечает исключительно за бухгалтерский учет. Если вы выводите данные из операции в общий журнал, убедитесь, что это не введет пользователей в заблуждение, так как остатки по складам или взаиморасчеты могут вестись в этой базе по регистрам, а не только по проводкам.
Также стоит обратить внимание на то, что в ПУБ даже такие объекты, как «Договор», могут быть оформлены как документы. Выясним причину: это сделано для того, чтобы документы могли ссылаться на них и строить хронологическую последовательность. У таких «документов» бухгалтерской операции, как правило, нет, поэтому проверка Док.Операция.Выбран() в коде выше обязательна для предотвращения ошибок выполнения.
Выясним, какие риски несет в себе использование формул в журнале. В 1С 7.7 код, написанный в формуле графы, выполняется каждый раз при отрисовке строки на экране. Если пользователь начнет быстро прокручивать список документов (скроллинг), функция будет вызываться сотни раз в секунду. Чтобы журнал не «тормозил», придерживаемся следующих правил:
Объект.ВыполнитьЗапрос) внутри функций, вызываемых из колонок журнала.ТекущийДокумент.Выбран(), чтобы не тратить ресурсы на обработку пустых строк в конце списка.Если производительность системы является критическим фактором, рассмотрим альтернативный вариант — использование внешней компоненты FormEx. Это мощный инструмент для 1С 7.7, который позволяет перехватывать событие отрисовки таблицы. С помощью FormEx можно программно «раскрашивать» ячейки и подставлять в них значения гораздо быстрее, чем через стандартные формулы. Однако этот метод требует установки дополнительных библиотек на рабочие места пользователей.
Еще один совет, который часто встречается на форумах: вместо использования ручных проводок через стандартную «Операцию», лучше использовать документ «Бухгалтерская справка» (если он есть в конфигурации или его можно перенести из типовой Бухгалтерии). У такого документа все реквизиты являются стандартными, и их легко вывести в любой журнал без написания дополнительного кода, просто выбрав их в конфигураторе.
Подводя итог, можно сказать, что наиболее эффективным и доступным методом остается создание функции в модуле формы журнала с обращением к ТекущийДокумент.Операция.ИмяРеквизита. Это решение позволяет гибко управлять отображением данных и сохранять работоспособность типовой конфигурации без глобальных переделок.