Почему счет 27 не сохраняется в поле 'Счет учета' документа в 1С?

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

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

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

Причина 1: Использование счета-группы вместо субсчета для учета

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

В нашем случае счет 27 "Материальные ценности, выданные в личное пользование работникам (сотрудникам)" является именно таким счетом-группой. Реальный учет ведется на его субсчетах, например:

Проанализируем код, который приводит к ошибке:


// Этот код добавляет счета в список выбора на форме
// Получаем счет-группу 27
лкСчет = БухгалтерскийУчет.СчетПоКоду("27", Объект.Дата, Объект.Организация);
Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет, "Ткани и изделия из них");

// Получаем конечный субсчет 105.00
лкСчет1 = БухгалтерскийУчет.СчетПоКоду("105.00", Объект.Дата, Объект.Организация);
Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет1, "Материальные средства: ручки, тарелки и.т.д");

Что здесь происходит? Метод БухгалтерскийУчет.СчетПоКоду("27", ...) успешно находит и возвращает ссылку на счет-группу "27". Эта ссылка добавляется в выпадающий список выбора, и пользователь ее видит. Однако, когда пользователь выбирает эту строку, система пытается записать в реквизит документа "СчетУчета" ссылку на счет-группу. Реквизит документа, предназначенный для хранения счета учета, не может принять такое значение, так как он ожидает ссылку на конечный, "рабочий" субсчет. В результате платформа просто не записывает некорректное значение, и поле остается пустым.

Со счетом 105.00 ситуация иная: код "105.00" — это код конечного субсчета, и система корректно его находит, записывает и сохраняет.

Причина 2: Истекший срок действия счета

Еще один важный момент, который усугубляет ситуацию, — это актуальность плана счетов. В конфигурациях, особенно для бюджетного учета (БГУ), планы счетов периодически меняются в соответствии с законодательством.

Так, старый забалансовый счет с кодом "27" мог иметь ограниченный срок действия, например, до 31.12.2020. С 1 января 2021 года для учета тех же ценностей были введены новые субсчета — 27.01 и 27.02. Если вы создаете документ с датой, например, в 2021 году или позже, то использование старого кода "27" недопустимо еще и по причине его недействительности на дату документа.

Важно: Всегда проверяйте актуальность и срок действия счетов в Плане счетов (в конфигурации БГУ это ЕПСБУ) на дату проведения операции.

Как правильно получить и подставить нужный счет

Теперь, когда мы выяснили причины, рассмотрим правильные способы решения задачи.

Решение 1: Получение счета по точному коду субсчета

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

Посмотрим на исправленный код:


// Правильный способ: получаем конкретный субсчет по его полному коду
лкСчет27_01 = БухгалтерскийУчет.СчетПоКоду("27.01", Объект.Дата, Объект.Организация);

// Рекомендуется всегда проверять, что счет был найден
Если ЗначениеЗаполнено(лкСчет27_01) Тогда
    Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет27_01, "Спецодежда в эксплуатации (27.01)");
КонецЕсли;

// Аналогично для другого субсчета, если он нужен
лкСчет27_02 = БухгалтерскийУчет.СчетПоКоду("27.02", Объект.Дата, Объект.Организация);
Если ЗначениеЗаполнено(лкСчет27_02) Тогда
    Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет27_02, "Спецоснастка в эксплуатации (27.02)");
КонецЕсли;

// Для счета 105 код остается прежним, так как он уже был корректным
лкСчет105 = БухгалтерскийУчет.СчетПоКоду("105.00", Объект.Дата, Объект.Организация);
Если ЗначениеЗаполнено(лкСчет105) Тогда
    Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет105, "Материальные средства (105.00)");
КонецЕсли;

Если вы пробовали такой код, и он "не работал", то есть СчетПоКоду возвращал Неопределено, проверьте следующее:

  1. Отсутствие опечаток. Убедитесь, что код введен без лишних пробелов или символов (правильно — "27.01", неправильно — "27. 01" или "27,01").
  2. Актуальность счета. Откройте План счетов и убедитесь, что счет с кодом 27.01 существует и является действующим на дату, указанную в Объект.Дата.

Решение 2: Получение списка всех субсчетов из группы

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

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


// Получаем массив всех счетов, входящих в группу "27", действующих на дату документа
МассивСчетов27 = БухгалтерскийУчет.СписокСчетов("27", Объект.Дата, , Объект.Организация);

// Перебираем полученный массив
Для Каждого Счет Из МассивСчетов27 Цикл
    // Пропускаем саму группу, так как она не предназначена для проводок
    Если Счет.Вид = Перечисления.ВидыСчетов.Группа Тогда
        Продолжить;
    КонецЕсли;
    
    // Добавляем в список выбора только конечные субсчета
    Элементы.СчетУчета.СписокВыбора.Добавить(Счет, Счет.Представление);
КонецЦикла;

Этот код является более универсальным, так как он автоматически добавит все активные субсчета из группы 27, даже если в будущем в плане счетов появятся новые (например, 27.03).

Итоги и рекомендации

Чтобы избежать подобных ошибок в будущем, следуйте простым правилам:

  1. Различайте счета-группы и субсчета. Для любых учетных операций (запись в реквизиты документов, формирование проводок) всегда используйте ссылки на конечные субсчета.
  2. Проверяйте план счетов. Перед использованием счета в коде убедитесь в его существовании, правильности кода и сроке действия на предполагаемую дату операции.
  3. Используйте правильные методы. Для получения конкретного счета применяйте БухгалтерскийУчет.СчетПоКоду() с полным кодом субсчета. Для получения всех дочерних счетов группы — БухгалтерскийУчет.СписокСчетов() с последующей обработкой результата.

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

← На главную