Рассмотрим распространенную ситуацию, с которой сталкиваются программисты 1С при работе с планом счетов. Вы программно добавляете в список выбора поля "Счет учета" два счета: например, 105.00 и 27. После выбора в документе счет 105.00 корректно сохраняется и отображается, а счет 27 просто исчезает из поля после выбора или при сохранении документа. В форме списка документов в колонке счета учета также пусто.
Давайте разберемся, почему так происходит и как это исправить. Проблема кроется в фундаментальных принципах работы с планом счетов в 1С.
Самая главная причина — это разница между счетом-группой и конечным счетом (субсчетом), на котором ведется учет. В плане счетов 1С существует иерархия. Счета, которые объединяют в себе другие счета, являются группами. Они предназначены для аналитики, удобства навигации и формирования сводных отчетов. Формировать бухгалтерские проводки и вести учет напрямую по счетам-группам нельзя.
В нашем случае счет 27 "Материальные ценности, выданные в личное пользование работникам (сотрудникам)" является именно таким счетом-группой. Реальный учет ведется на его субсчетах, например:
Проанализируем код, который приводит к ошибке:
// Этот код добавляет счета в список выбора на форме
// Получаем счет-группу 27
лкСчет = БухгалтерскийУчет.СчетПоКоду("27", Объект.Дата, Объект.Организация);
Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет, "Ткани и изделия из них");
// Получаем конечный субсчет 105.00
лкСчет1 = БухгалтерскийУчет.СчетПоКоду("105.00", Объект.Дата, Объект.Организация);
Элементы.СчетУчета.СписокВыбора.Добавить(лкСчет1, "Материальные средства: ручки, тарелки и.т.д");
Что здесь происходит? Метод БухгалтерскийУчет.СчетПоКоду("27", ...) успешно находит и возвращает ссылку на счет-группу "27". Эта ссылка добавляется в выпадающий список выбора, и пользователь ее видит. Однако, когда пользователь выбирает эту строку, система пытается записать в реквизит документа "СчетУчета" ссылку на счет-группу. Реквизит документа, предназначенный для хранения счета учета, не может принять такое значение, так как он ожидает ссылку на конечный, "рабочий" субсчет. В результате платформа просто не записывает некорректное значение, и поле остается пустым.
Со счетом 105.00 ситуация иная: код "105.00" — это код конечного субсчета, и система корректно его находит, записывает и сохраняет.
Еще один важный момент, который усугубляет ситуацию, — это актуальность плана счетов. В конфигурациях, особенно для бюджетного учета (БГУ), планы счетов периодически меняются в соответствии с законодательством.
Так, старый забалансовый счет с кодом "27" мог иметь ограниченный срок действия, например, до 31.12.2020. С 1 января 2021 года для учета тех же ценностей были введены новые субсчета — 27.01 и 27.02. Если вы создаете документ с датой, например, в 2021 году или позже, то использование старого кода "27" недопустимо еще и по причине его недействительности на дату документа.
Важно: Всегда проверяйте актуальность и срок действия счетов в Плане счетов (в конфигурации БГУ это ЕПСБУ) на дату проведения операции.
Теперь, когда мы выяснили причины, рассмотрим правильные способы решения задачи.
Это самый простой и надежный способ, если вы точно знаете, какой субсчет вам нужен. Вместо кода группы "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)");
КонецЕсли;
Если вы пробовали такой код, и он "не работал", то есть СчетПоКоду возвращал Неопределено, проверьте следующее:
План счетов и убедитесь, что счет с кодом 27.01 существует и является действующим на дату, указанную в Объект.Дата.Этот способ подходит, если вы хотите предоставить пользователю выбор из всех доступных субсчетов, входящих в группу 27. Для этого используется метод БухгалтерскийУчет.СписокСчетов().
Он возвращает массив ссылок на счета, которые входят в указанную группу. Нам остается только перебрать этот массив и добавить в список выбора только конечные субсчета, пропустив саму группу.
// Получаем массив всех счетов, входящих в группу "27", действующих на дату документа
МассивСчетов27 = БухгалтерскийУчет.СписокСчетов("27", Объект.Дата, , Объект.Организация);
// Перебираем полученный массив
Для Каждого Счет Из МассивСчетов27 Цикл
// Пропускаем саму группу, так как она не предназначена для проводок
Если Счет.Вид = Перечисления.ВидыСчетов.Группа Тогда
Продолжить;
КонецЕсли;
// Добавляем в список выбора только конечные субсчета
Элементы.СчетУчета.СписокВыбора.Добавить(Счет, Счет.Представление);
КонецЦикла;
Этот код является более универсальным, так как он автоматически добавит все активные субсчета из группы 27, даже если в будущем в плане счетов появятся новые (например, 27.03).
Чтобы избежать подобных ошибок в будущем, следуйте простым правилам:
БухгалтерскийУчет.СчетПоКоду() с полным кодом субсчета. Для получения всех дочерних счетов группы — БухгалтерскийУчет.СписокСчетов() с последующей обработкой результата.Применение этих принципов гарантирует корректную работу с планом счетов и избавляет от неочевидных ошибок, когда данные "пропадают" из полей ввода.