При работе в 1С:Комплексной автоматизации 2.4 (КА 2.4) пользователи часто сталкиваются с необходимостью включить ведение суммового учета для субконто "Склад" на счете 10 "Материалы". Это стандартная практика для корректного отражения себестоимости материалов в разрезе складов. Однако, в отличие от 1С:Бухгалтерии, где такая настройка доступна напрямую через пользовательский интерфейс, в КА 2.4 прямой и очевидной опции для этого нет. Рассмотрим, почему это так и какие существуют способы решения этой задачи.
В типовых конфигурациях 1С:Комплексная автоматизация и 1С:ERP аналитика по предопределенным счетам, таким как счет 10, часто жестко задана разработчиками. Это сделано для обеспечения корректной работы сложных механизмов учета затрат, себестоимости, партионного учета и т.д. Попытка изменить признаки учета субконто для таких счетов через стандартный интерфейс может быть заблокирована системой с сообщением о том, что "Состав видов субконто на этом счете определяется настройкой параметров учета." Это указывает на то, что параметры учета субконто могут быть установлены на более низком уровне, возможно, при первичном запуске, обновлении информационной базы или являются частью внутренней логики программы, не доступной для прямого редактирования пользователем.
Давайте подробно разберем возможные подходы к решению этой проблемы, начиная с более инвазивных и заканчивая рекомендуемыми методами без снятия конфигурации с поддержки.
Этот метод подразумевает прямое изменение кода формы счета в режиме "Конфигуратор" на короткий период, чтобы обойти встроенные проверки платформы и установить нужный признак. Мы настоятельно не рекомендуем этот подход для постоянного использования, так как он требует прямого изменения типовой конфигурации, что может усложнить дальнейшие обновления. Однако, как временное решение, он может быть использован для быстрого восстановления работоспособности.
&НаКлиенте Процедура ВидыСубконтоПередНачаломИзменения(Элемент, Отказ). Внутри этой процедуры обычно присутствует проверка, которая блокирует изменение видов субконто для определенных счетов. Мы обнаруживаем, что код, отвечающий за эту блокировку, выглядит примерно так:
//Если ЗапрещенныйСчет Тогда
// ПредупреждениеОНевозможностиИзмененияСоставаВидовСубконто(Отказ);
//КонецЕсли;
// в начале каждой строки. Это отключит проверку на момент нашего редактирования.ВидыСубконтоПередНачаломИзменения. Обновите конфигурацию базы данных. Это необходимо для восстановления типового поведения системы и предотвращения несанкционированных изменений в будущем.Этот метод позволяет добиться желаемого результата, но он требует осторожности и четкого выполнения шагов по возвращению конфигурации к исходному состоянию.
Использование расширений — это наиболее современный и рекомендуемый способ внесения изменений в типовые конфигурации 1С без снятия их с поддержки. Мы можем создать расширение, которое перехватит вызов функции или процедуры, блокирующей изменение, и позволит нам выполнить необходимое действие.
ВидыСубконтоПередНачаломИзменения. Для этого в модуле формы расширения создайте свою версию этой процедуры с директивой &Перед или &Вместо.
&Вместо Процедура ВидыСубконтоПередНачаломИзменения(Элемент, Отказ)
// В этом месте мы можем пропустить оригинальную проверку, если это необходимо
// или добавить свою логику.
// Если мы хотим разрешить изменение для счета 10, мы можем просто ничего не делать
// или установить Отказ = Ложь
// Пример:
// Если Элемент.ТекущиеДанные.Ссылка = ПланыСчетов.Хозрасчетный.Материалы Тогда
// Отказ = Ложь; // Разрешаем изменение для счета 10
// Иначе
// // Вызываем оригинальную процедуру, если нужно сохранить стандартное поведение для других счетов
// ВызовОригинальнойПроцедуры(Элемент, Отказ);
// КонецЕсли;
// В данном случае, чтобы полностью отключить запрет для счета 10,
// мы можем просто не выполнять никакой блокировки для него.
// Или, как вариант, можно переопределить функцию ПолучитьЗапрещенныеСчета
// В модуле формы, который мы добавили в расширение, найдите функцию:
// &ИзменениеФункции ПолучитьЗапрещенныеСчета()
// ЗапрещенныеСчета = Новый СписокЗначений;
// // Добавляем только те счета, которые мы действительно хотим запретить
// // Например, все, кроме счета 10
// Для каждого СчетЗапрета Из ОригинальныеЗапрещенныеСчета() Цикл
// Если СчетЗапрета <> ПланыСчетов.Хозрасчетный.Материалы Тогда
// ЗапрещенныеСчета.Добавить(СчетЗапрета);
// КонецЕсли;
// КонецЦикла;
// Возврат ЗапрещенныеСчета;
// Самый простой способ: если текущий счет - Материалы, разрешаем редактирование.
Если Элемент.ТекущиеДанные.Ссылка = ПланыСчетов.Хозрасчетный.Материалы Тогда
Отказ = Ложь; // Позволяем редактировать субконто для счета 10
Иначе
// Для других счетов сохраняем типовое поведение.
// Здесь потребуется вызов оригинальной процедуры, если она есть и содержит нужную логику.
// Но так как наша цель - только для счета 10, мы можем просто пропустить вызов для него.
// Для остальных можно оставить вызов или позволить работать оригинальному коду без &Вместо.
// Более правильный подход - использование &Перед и изменение параметра Отказ.
Если Элемент.ТекущиеДанные.Предопределенное Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Мы предлагаем перехватить процедуру ВидыСубконтоПередНачаломИзменения с помощью директивы &Вместо и явно установить Отказ = Ложь для счета 10. Это даст нам контроль над поведением формы для конкретного счета. Также можно перехватить функцию ПолучитьЗапрещенныеСчета (если она используется в модуле формы) и исключить из списка запрещенных счет 10:
&ИзменениеФункции ПолучитьЗапрещенныеСчета()
ЗапрещенныеСчета = Новый СписокЗначений;
ОригинальныеЗапрещенныеСчета = ОригинальноеВыполнениеФункции(); // Вызов оригинальной функции
Для каждого Счет Из ОригинальныеЗапрещенныеСчета Цикл
Если Счет.Значение <> ПланыСчетов.Хозрасчетный.Материалы Тогда // Исключаем счет 10
ЗапрещенныеСчета.Добавить(Счет.Значение);
КонецЕсли;
КонецЦикла;
Возврат ЗапрещенныеСчета;
КонецФункции
Важно: Директива &ИзменениеФункции позволяет изменить существующую функцию. После перехвата, сохраните расширение, включите его в режиме предприятия, и затем вы сможете изменить настройки счета 10 через пользовательский интерфейс, как описано в шагах 6-9 для Метода 1.
В ходе обсуждения на форуме мы обнаруживаем упоминание о функции ОпределитьПараметрыУчета, которая, по-видимому, устанавливает флаг ВестиСуммовойУчетПоСкладам = Истина. Однако отмечается, что к этой функции ничего не обращается из пользовательского интерфейса, и она служит для определения текущих параметров, а не их установки. Тем не менее, это дает нам понимание того, как система internally определяет эти параметры:
Функция ОпределитьПараметрыУчета Экспорт
ПараметрыУчета = ОбщегоНазначенияБПКлиентСервер.СтруктураПараметровУчета;
// Запасы БУ
БУ = ПланыСчетов.Хозрасчетный.Товары.ПолучитьОбъект; // В данном случае, это относится к счету "Товары"
// Но принцип аналогичен для счета "Материалы"
// ВестиПартионныйУчет = БУ.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Партии, "ВидСубконто") <> Неопределено;
ВестиСкладскойУчет = БУ.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, "ВидСубконто") <> Неопределено;
Если ВестиСкладскойУчет Тогда
ВестиСуммовойУчетПоСкладам = БУ.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, "ВидСубконто").Суммовой;
Иначе
ВестиСуммовойУчетПоСкладам = Ложь;
КонецЕсли;
Возврат ПараметрыУчета; // Функция возвращает структуру параметров
КонецФункции
Эта функция лишь читает текущее состояние настройки. Чтобы изменить его, нам необходимо напрямую обратиться к объекту "План счетов" и его свойствам. Хотя в обсуждении упоминается, что "универсальной обработкой редактирования объектов" получилось отключить учет, но включить назад было сложно, это не исключает возможность, что прямая модификация объекта "ПланСчетов" может быть сделана, если обойти все платформенные и конфигурационные запреты. Такой подход будет выглядеть следующим образом:
Счет10 = ПланыСчетов.Хозрасчетный.Материалы.ПолучитьОбъект();
Если Счет10 <> Неопределено Тогда
ВидСубконтоСклад = Счет10.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, "ВидСубконто");
Если ВидСубконтоСклад <> Неопределено Тогда
Если Не ВидСубконтоСклад.Суммовой Тогда
Попытка
Счет10.ВидыСубконто.Загрузить(ВидСубконтоСклад); // Загружаем текущий элемент, чтобы изменить его
ВидСубконтоСклад.Суммовой = Истина;
// Может потребоваться удаление старого элемента и добавление нового
// Если прямое изменение свойства не работает
// Счет10.ВидыСубконто.Удалить(ВидСубконтоСклад);
// ВидСубконтоСкладНовый = Счет10.ВидыСубконто.Добавить();
// ЗаполнитьЗначенияСвойств(ВидСубконтоСкладНовый, ВидСубконтоСклад);
// ВидСубконтоСкладНовый.Суммовой = Истина;
Счет10.Записать(); // Записываем изменения
Сообщить("Суммовой учет по субконто 'Склады' для счета 10 успешно включен.");
Исключение
Сообщить("Ошибка при записи счета: " + ОписаниеОшибки());
Сообщить("Возможно, необходимо временно отключить проверки в модуле формы или использовать расширение.");
КонецПопытки;
Иначе
Сообщить("Суммовой учет по субконто 'Склады' для счета 10 уже включен.");
КонецЕсли;
Иначе
Сообщить("Субконто 'Склады' не найдено для счета 10.");
КонецЕсли;
Иначе
Сообщить("Счет 10 'Материалы' не найден.");
КонецЕсли;
Мы должны понимать, что прямая программная модификация предопределенных объектов, даже если она технически возможна, может быть рискованной из-за скрытых проверок или жесткой логики платформы, которая не позволит записать изменения. Часто сообщения о "запрещенных счетах" указывают на такие блокировки. Поэтому этот метод может потребовать комбинации с Методом 1 или 2, где мы временно ослабляем контроль над объектом для его изменения.
Если все вышеперечисленные методы кажутся слишком сложными или рискованными, мы можем рассмотреть обходное решение — создание нового, непредопределенного счета, для которого мы сможем настроить аналитику по нашему усмотрению.
10.01.1 "Материалы (суммовой по складам)".10.01.1.Преимущества: Этот метод позволяет избежать изменения типовой конфигурации и не требует использования конфигуратора или расширений для основной задачи. Недостатки: Он требует дополнительных усилий по настройке проводок и, возможно, переносу остатков с существующего счета 10.01 на новый. Кроме того, это может усложнить типовую отчетность, поскольку придется агрегировать данные с двух разных счетов.
В ходе поиска решения на форуме были предложены и другие варианты, которые, однако, не подходят для КА 2.4, но дают понимание общей картины:
Эти примеры показывают, что в более ранних версиях и в других конфигурациях 1С такие настройки были доступны, но в КА 2.4 разработчики приняли решение о более жестком управлении предопределенными счетами.
Мы выяснили, что прямого и простого пользовательского способа включить суммовой учет для субконто "Склады" на счете 10 в 1С:Комплексная автоматизация 2.4 нет. Однако мы рассмотрели несколько эффективных, хотя и более сложных, подходов:
Перед любыми изменениями в конфигурации или использованием внешних обработок мы настоятельно рекомендуем сделать резервную копию информационной базы. Изменение настроек субконто для счетов, которые уже используются в учете, может привести к нарушению целостности данных. Выбирайте метод, который наиболее соответствует вашим навыкам и политике управления изменениями в вашей организации.