Как исправить ошибку "Вид субконто 'Партии' не доступен для данной записи" при программной смене счета?

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

При разработке внешних обработок для 1С:Бухгалтерии 8.3 программисты часто сталкиваются с необходимостью программной корректировки движений документов. Одной из самых коварных ошибок является ситуация, когда при попытке записи набора записей регистра бухгалтерии система выдает сообщение: "Запись не верна! Вид субконто 'Партии' не доступен для данной записи!". Особенно часто это проявляется при переносе данных со счета 41.11 (Товары в розничной торговле в АТТ по покупной стоимости) на счет 41.12 (Товары в розничной торговле в НТТ по продажной стоимости).

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

Анализ причины возникновения ошибки

Проанализируем механику работы регистра бухгалтерии. Когда мы считываем набор записей документа (регистратор), каждая строка (проводка) уже содержит заполненную коллекцию Субконто. Если исходный документ был проведен по счету 41.11, на котором в плане счетов настроен учет по субконто Номенклатура, Склады и Партии, то в оперативной памяти объект Проводка хранит эти три ключа.

Ошибка происходит в тот момент, когда мы меняем значение поля СчетДт на 41.12. В типовой конфигурации "Бухгалтерия предприятия 3.0" счет 41.12 предназначен для учета в неавтоматизированных торговых точках (НТТ), где чаще всего ведется только суммовой учет без аналитики по партиям (а иногда и без номенклатуры). Как только мы меняем счет, платформа при вызове метода Записать() выполняет валидацию: она проверяет, соответствуют ли виды субконто, находящиеся в коллекции записи, тем видам субконто, которые разрешены для нового счета в Плане счетов Хозрасчетный.

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

Решение №1: Использование метода Очистить() и Вставить()

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

Разберем пример правильного кода:


Для Каждого Проводка Из ПроводкиПриемник Цикл
    Если Проводка.СчетДт = Стр_Сч4111 Тогда
        // 1. Сначала меняем счет
        Проводка.СчетДт = Сч_Сч4112;
        
        // 2. Полностью очищаем коллекцию субконто для этой записи
        Проводка.СубконтоДт.Очистить();
        
        // 3. Заполняем только те субконто, которые реально есть на новом счете
        // Используем метод Вставить, чтобы избежать ошибок обращения
        Проводка.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, НайденныйСклад);
        
        // Проверяем, нужна ли номенклатура на счете 41.12 (зависит от настроек учета)
        Проводка.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура, Товар);
        
        // Субконто "Партии" мы просто не добавляем!
    КонецЕсли;
КонецЦикла;
ПроводкиПриемник.Записать();

Использование метода Вставить(ВидСубконто, Значение) является «лучшей практикой» в 1С. Если вы передадите в этот метод ВидСубконто, который не определен для данного счета, платформа в большинстве случаев либо проигнорирует его, либо выдаст ошибку в более мягкой форме, но это позволит вам динамически управлять составом аналитики.

Решение №2: Проверка доступности субконто на счете

Если ваша обработка должна быть универсальной и работать с разными счетами, проанализируем ситуацию, как проверить наличие субконто программно. Мы можем обратиться к коллекции ВидыСубконто самого счета в плане счетов.

Посмотрим на пример функции-проверки:


Функция ЕстьСубконтоНаСчете(ВыбСчет, ВыбВидСубконто)
    Для Каждого СтрокаВидаСубконто Из ВыбСчет.ВидыСубконто Цикл
        Если СтрокаВидаСубконто.ВидСубконто = ВыбВидСубконто Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции

// Применение в коде:
ПартииСубконто = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии;
Если ЕстьСубконтоНаСчете(Проводка.СчетДт, ПартииСубконто) Тогда
    Проводка.СубконтоДт[ПартииСубконто] = СсылкаНаПартию;
КонецЕсли;

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

Влияние типов складов и настроек учета

Выясним причину, почему проблема может «плавать» (например, в ноябре документы загружались, а в декабре — нет). В 1С:Бухгалтерии поведение счета 41.12 тесно связано с типом склада:

  1. Розничный магазин (АТТ): Обычно предполагает использование счета 41.11 с количественным и партионным учетом.
  2. Неавтоматизированная торговая точка (НТТ): Работает со счетом 41.12. Для этого типа склада в настройках программы часто отключается учет по номенклатуре и партиям, оставляя только суммовой учет в разрезе складов.

Если в середине периода бухгалтер изменил тип склада в справочнике Склады или поменял настройки в "Параметрах учета" (раздел "Настройки учета номенклатуры"), состав доступных субконто на счетах мог измениться. Именно поэтому ваша обработка, которая ранее успешно записывала «пустые» партии, начала выдавать ошибку — метаданные счета стали жестче контролировать состав аналитики.

Почему удаление и добавление проводки заново не всегда помогает?

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

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

Резюме для разработчика

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

← На главную