Как создать документ «Операция» в самописной конфигурации 1С и решить распространенные проблемы?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Создание документа «Операция» и устранение первоначальных ошибок при работе с регистром бухгалтерии

При создании нового документа «Операция» в самописной конфигурации, где изначально отсутствуют типовые справочники, такие как «Организации» или обширные планы счетов, мы обычно стремимся к упрощенной версии. Однако, даже при таком подходе, могут возникнуть сложности, особенно при попытке записать движения в регистр бухгалтерии.

Проблема: Ошибка «Поле объекта не обнаружено (СчетДт)»

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

Предположение, что СчетДт является предопределенным словом и его нельзя использовать как реквизит документа, является неверным. Хотя в документе могут быть реквизиты с такими названиями для выбора счетов, сами поля СчетДт и СчетКт являются частью структуры записей регистра бухгалтерии.

Решение: Включение корреспонденции у регистра бухгалтерии

Ключевая причина ошибки «Поле объекта не обнаружено (СчетДт)» заключается в том, что у созданного регистра бухгалтерии не была включена корреспонденция. Для корректной работы с проводками (дебет и кредит) необходимо:

  1. Открыть конфигуратор и перейти к созданному регистру бухгалтерии (например, БухгРег).
  2. Перейти на закладку «Данные».
  3. Установить флажок «Корреспонденция».

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

Методы создания движений регистра бухгалтерии

Существует два основных подхода к созданию движений регистра бухгалтерии из документа:

1. Программное создание движений в модуле объекта

Этот метод предполагает написание кода в процедуре ОбработкаПроведения() модуля объекта документа. Мы будем вручную создавать записи регистра и заполнять их данными.

  1. Откроем модуль объекта нашего документа «Операция».
  2. Перейдем к процедуре ОбработкаПроведения().
  3. Добавим следующий код для создания движений:

// Включаем запись движений для нашего регистра бухгалтерии
Движения.БухгРег.Записывать = Истина; 

// Создаем новую запись движения
Движение = Движения.БухгРег.Добавить();

// Заполняем основные поля движения
// Предполагаем, что СчетДт, СчетКт, Сценарии, Подразделения, Сумма
// берутся из реквизитов или табличных частей документа
Движение.СчетДт = СчетДт; 
Движение.Сценарий = Сценарии; 
Движение.СчетКт = СчетКт;
Движение.ПодразделениеКт = Подразделения; // Пример небалансового измерения/субконто по кредиту
Движение.Период = Дата; // Дата документа
Движение.Сумма = Сумма; // Сумма проводки

// Если необходимо движение и по подразделению дебета:
// Движение.ПодразделениеДт = Подразделения; 

В этом коде мы устанавливаем свойство Записывать в Истина для нашего регистра БухгРег. Затем добавляем новую запись движения и заполняем ее свойства, такие как СчетДт, СчетКт, Период, Сумма, а также значения для измерений регистра, таких как Сценарий, ПодразделениеКт. Важно убедиться, что реквизиты документа (например, СчетДт, СчетКт) имеют тип ПланСчетовСсылка.ВашПланСчетов, а измерения (например, Сценарии, Подразделения) имеют соответствующие ссылочные типы.

Помните, что СчетДт и СчетКт – это поля самого регистра, куда мы присваиваем ссылки на элементы плана счетов. Если в документе есть реквизиты с такими же именами, они служат лишь для удобства ввода и выбора этих ссылок.

2. Интерактивное создание движений на форме документа

Если мы хотим предоставить пользователям возможность вручную вводить движения прямо на форме документа без написания сложного кода проведения, мы можем добавить на форму элемент типа «Таблица движения».

  1. Откроем форму документа «Операция» в конфигураторе.
  2. Добавим новый элемент управления (например, таблица).
  3. В свойствах этого элемента укажем путь к данным: Объект.Движения.ИмяВашегоРегистраБухгалтерии (например, Объект.Движения.БухгРег).

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

Настройка видов субконто для предопределенных элементов плана счетов

Часто возникает вопрос, почему в плане счетов в предопределенных элементах недоступно создание видов субконто. Это может быть связано с ограничениями в настройках самого плана счетов.

Проблема: Невозможность задать субконто для предопределенных счетов

При попытке настроить субконто для предопределенных счетов в нашем плане счетов мы можем обнаружить, что соответствующие поля для выбора видов субконто неактивны или отсутствуют.

Решение: Увеличение максимального количества субконто

Чтобы иметь возможность назначать виды субконто для любых счетов, включая предопределенные, нам необходимо убедиться, что план счетов настроен на поддержку нужного количества субконто. Для этого выполним следующие шаги:

  1. Откроем конфигуратор и перейдем к нашему плану счетов (например, Основной).
  2. Перейдем на закладку «Данные».
  3. Найдем свойство «Максимальное количество субконто» и установим его на необходимое значение (например, 3, если мы планируем использовать до трех видов субконто на счете).

После установки этого параметра, мы сможем выбрать и настроить виды субконто для каждого счета индивидуально, включая предопределенные элементы. В типовых конфигурациях, таких как БП 3.0, для настройки субконто используются более сложные механизмы, например, объект ВидыСубконтоХозрасчетные, который позволяет гибко управлять составом субконто для каждого счета.

Отладка и просмотр сообщений функции «Сообщить» в процедуре «ОбработкаПроведения»

При отладке серверного кода в 1С, например, в процедуре ОбработкаПроведения(), мы часто используем функцию Сообщить() для вывода информации. Однако иногда кажется, что эта функция не работает, так как сообщения не отображаются.

Проблема: Сообщения от функции «Сообщить» не выводятся

Мы написали код с функцией Сообщить() в процедуре ОбработкаПроведения(), но при выполнении документа сообщения не появляются на экране.

Решение: Правильный режим проведения и особенности вывода сообщений

Функция Сообщить() в процедурах проведения документов работает, но ее результат может быть не виден из-за особенностей вывода сообщений в 1С. Сообщения, формируемые на сервере во время транзакции, буферизуются и отображаются пользователю только после завершения транзакции проведения документа.

  1. Используем кнопку «Провести», а не «Провести и закрыть». Если мы нажимаем кнопку «Провести и закрыть», форма документа закрывается до того, как система успеет вывести буферизованные сообщения. Используя кнопку «Провести», мы даем системе время завершить транзакцию и отобразить сообщения на открытой форме документа.
  2. Особенности серверного кода. Для более надежной отладки серверного кода рекомендуется использовать встроенный отладчик 1С. Также для логирования информации можно применять функцию ЗаписьЖурналаРегистрации(), которая записывает сообщения в журнал регистрации, доступный для просмотра независимо от режима проведения.

Понимание этих нюансов поможет нам эффективно отлаживать код и получать необходимую информацию о его работе.

Удаление документа, связанного с характеристиками плана счетов

Иногда при попытке удалить документ из конфигурации мы получаем ошибку, указывающую на то, что объект используется в плане счетов.

Проблема: Невозможно удалить документ «ОперацияБух» из-за ссылки в плане счетов

Мы пытаемся удалить документ, но система выдает сообщение: «Объект "Документ.ОперацияБух" использован в: ПланСчетов.Основной.Характеристики». При этом в самом плане счетов мы не можем найти явных ссылок на этот документ.

Решение: Удаление ссылки из видов характеристик (субконто) плана счетов

Ошибка указывает на то, что тип нашего удаляемого документа был указан как возможный тип значения для какого-либо вида субконто в плане счетов. Чтобы удалить документ, нам необходимо удалить эти ссылки.

  1. Откроем конфигуратор и перейдем к нашему плану счетов (например, Основной).
  2. Перейдем на закладку «Данные».
  3. В разделе «Виды характеристик (субконто)» мы увидим список всех определенных видов субконто.
  4. Для каждого вида субконто необходимо проверить его свойство «Тип значения». Мы обнаружим, что в списке возможных типов значений (среди примитивных типов, ссылок на справочники и другие документы) присутствует ссылка на наш удаляемый документ (например, Документ.ОперацияБух).
  5. Удалим эту ссылку на тип документа из списка возможных типов значений для всех соответствующих видов характеристик.

После того как все ссылки на удаляемый документ будут устранены из свойств видов характеристик плана счетов, мы сможем успешно удалить сам документ из конфигурации.

Проверка принадлежности элемента справочника к иерархической группе

При работе со справочниками, имеющими иерархическую структуру (например, «Подразделения»), часто требуется проверить, принадлежит ли один элемент другому в этой иерархии.

Проблема: Как проверить принадлежность элемента справочника к иерархии в модуле подписки

Нам необходимо в модуле подписки на событие проверить, является ли определенное подразделение дочерним элементом другого подразделения или совпадает с ним.

Решение: Использование метода «ПринадлежитЭлементу()»

Для проверки принадлежности элемента справочника к другой иерархической группе (или к самому элементу) в 1С используется метод ПринадлежитЭлементу(). Этот метод применим к ссылочным типам справочников, поддерживающих иерархию.

Рассмотрим пример:


// Предполагаем, что Источник.Подразделения - это элемент-группа,
// к которой мы проверяем принадлежность, а СтрокаТабЧасти.Подразделение -
// проверяемый элемент.
Если Источник.Подразделения.ПринадлежитЭлементу(СтрокаТабЧасти.Подразделение) Тогда
    // Действия, если элемент принадлежит группе
    Сообщить("Подразделение принадлежит указанной группе.");
Иначе
    // Действия, если элемент не принадлежит группе
    Сообщить("Подразделение не принадлежит указанной группе.");
КонецЕсли;

Метод ПринадлежитЭлементу() возвращает значение Истина, если проверяемый элемент (в нашем случае СтрокаТабЧасти.Подразделение) является дочерним элементом или самим элементом, для которого вызван метод (Источник.Подразделения), в иерархической структуре справочника. Этот метод чрезвычайно полезен при реализации проверок прав доступа, фильтрации данных или других логических условий, зависящих от иерархии.

Создание движений по балансовым и небалансовым измерениям регистра бухгалтерии

При конфигурировании регистра бухгалтерии мы можем определить различные измерения: балансовые (которые влияют на сам бухгалтерский баланс, например, Сценарий или Валюта) и небалансовые (которые используются для дополнительной аналитики, например, Подразделение).

Проблема: Как правильно создать движения для балансовых и небалансовых измерений

Мы определили в регистре бухгалтерии БухгРег балансовое измерение Сценарий и небалансовое Подразделение, а также ресурс Сумма. Возникает вопрос, как корректно программно заполнить эти измерения при создании движений.

Решение: Присвоение значений соответствующим полям записи движения

Каждое измерение, ресурс или субконто, определенное в регистре бухгалтерии, становится доступным как свойство записи движения. Мы просто присваиваем им соответствующие значения.

Рассмотрим пример кода для создания движения, учитывающего балансовое измерение Сценарий и небалансовое Подразделение:


// Активируем запись движений для регистра БухгРег
Движения.БухгРег.Записывать = Истина; 

// Создаем новую запись движения
Движение = Движения.БухгРег.Добавить();

// Заполняем основные реквизиты проводки
Движение.Период = Дата;
Движение.Сумма = Сумма;

// Заполняем счета дебета и кредита
Движение.СчетДт = СчетДебета; // Ссылка на элемент Плана счетов
Движение.СчетКт = СчетКредита; // Ссылка на элемент Плана счетов

// Заполняем балансовое измерение "Сценарий"
// Если Сценарий является общим для всей проводки, то это будет одно поле:
Движение.Сценарий = Сценарии; // Ссылка на элемент справочника Сценарии

// Заполняем небалансовое измерение "Подразделение"
// Если Подразделение является отдельным измерением, связанным с дебетом/кредитом
// (аналогично ВалютаДт/ВалютаКт, если у счета стоит флаг "УчетПоПодразделениям"):
Движение.ПодразделениеДт = ПодразделенияДляДебета; // Ссылка на элемент справочника Подразделения
Движение.ПодразделениеКт = ПодразделенияДляКредита; // Ссылка на элемент справочника Подразделения

// Если Подразделение является общим измерением для проводки
// (не разделяется на Дт/Кт в структуре регистра), то будет одно поле:
// Движение.Подразделение = Подразделения; 

Важно учитывать, как именно были настроены измерения в регистре:

  1. Если измерение Сценарий является простым измерением регистра, оно будет доступно как Движение.Сценарий.
  2. Если измерение Подразделение настроено как аналитика, привязанная к счетам (подобно субконто, или как ВалютаДт / ВалютаКт при валютном учете), то в структуре регистра могут автоматически появиться поля ПодразделениеДт и ПодразделениеКт. Их наличие обычно зависит от свойства счета «УчетПоПодразделениям» или аналогичной настройки, если она реализована.
  3. Если Подразделение является видом субконто для счетов, то для его заполнения нам потребуется использовать коллекцию СубконтоДт и СубконтоКт:
    
    Движение.СубконтоДт.Вставить("Подразделение", ПодразделенияДляДебета);
    Движение.СубконтоКт.Вставить("Подразделение", ПодразделенияДляКредита);
    
    Но чаще всего, если это измерение регистра, то оно будет выглядеть как Движение.ПодразделениеДт / Движение.ПодразделениеКт.

Мы всегда должны ориентироваться на фактическую структуру нашего регистра бухгалтерии, которую мы определили в конфигураторе. Проверяя структуру регистра на закладке «Данные», мы увидим, какие поля для измерений доступны для заполнения.

← На главную