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