Работа с значениями по умолчанию в 1С:Предприятие — одна из тех рутинных задач, которые могут как упростить жизнь пользователям, так и создать массу проблем при неправильной настройке. От корректной установки дефолтных значений зависит скорость ввода данных, минимизация ошибок и даже логика бизнес-процессов. Например, автоматическое проставление Организации в новых документах или подстановка Склада по умолчанию при создании приходной накладной экономят десятки часов в месяц.
В этой статье мы разберём все способы установки значений по умолчанию — от базовых настроек в конфигураторе до программных решений на встроенном языке. Особое внимание уделим типичным ошибкам, которые приводят к "залипанию" неверных значений или конфликтам при обновлении конфигураций. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, которые хотят систематизировать знания по этой теме.
1. Виды значений по умолчанию в 1С
В 1С:Предприятие 8 значения по умолчанию можно разделить на три основные категории, каждая из которых имеет свои особенности настройки и применения:
- 📌 Статические значения — жёстко заданные в конфигураторе (например,
Дата = ТекущаяДата()в документах). Просты в настройке, но негибкие. - 🔄 Динамические значения — вычисляемые при создании объекта (например, подстановка
Ответственногоравного текущему пользователю). Требуют программного кода. - 📊 Контекстные значения — зависят от других реквизитов (например,
Складвыбирается в зависимости отОрганизации). Самые сложные в реализации, но максимально адаптивные.
Важно понимать, что механизм дефолтных значений работает на разных уровнях:
- 📁 Уровень конфигурации — настройки в метаданных (справочники, документы, регистры).
- 🖥️ Уровень формы — значения, проставляемые при открытии формы объекта.
- 📜 Уровень модуля — программная логика в обработчиках событий (
ПриСозданииНаСервере,ПередЗаписью).
2. Установка значений по умолчанию в конфигураторе
Самый простой способ задать дефолтные значения — использовать встроенные возможности конфигуратора. Этот метод подходит для статических значений, которые не требуют вычислений. Рассмотрим пошаговую инструкцию на примере справочника Номенклатура:
- Откройте конфигуратор в режиме
1С:Предприятие(с правами администратора). - Перейдите в ветку
Объекты конфигурации → Справочники → Номенклатура. - В палитре свойств справочника найдите раздел
Значения по умолчанию. - Для реквизита
ЕдиницаИзмеренияустановите значениешт.(или другой код из справочникаКлассификаторЕдиницИзмерения). - Сохраните конфигурацию (
Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).
Аналогичным образом настраиваются дефолтные значения для документов. Например, для документа ПоступлениеТоваровУслуг можно задать:
- 📅
Дата = ТекущаяДата() - 🏢
Организация = ТекущаяОрганизация()(если используется механизм организаций) - 📦
Склад = ОсновнойСклад()(требует предварительной настройки функции)
☑️ Проверка перед сохранением конфигурации
Ограничение этого метода: невозможно задать динамические значения, зависящие от контекста (например, текущего пользователя или времени суток). Для таких случаев потребуется программный код.
⚠️ Внимание: При обновлении типовых конфигураций (например, 1С:Бухгалтерия 3.0 или 1С:УТ 11) настройки значений по умолчанию в конфигураторе могут сброситься. Всегда фиксируйте такие изменения в отдельном расширении или внешней обработке.
3. Программная установка значений по умолчанию
Когда стандартных средств конфигуратора недостаточно, на помощь приходит встроенный язык 1С. Рассмотрим основные сценарии программной установки дефолтных значений:
3.1. Использование обработчика ПриСозданииНаСервере
Это самый универсальный способ, который позволяет задавать значения в зависимости от любых условий. Пример для документа ЗаказПокупателя:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем организацию по умолчанию
Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
Объект.Организация = ПолучатьОрганизациюПоУмолчанию();
КонецЕсли;
// Устанавливаем ответственного = текущий пользователь
Если Не ЗначениеЗаполнено(Объект.Ответственный) Тогда
Объект.Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
// Устанавливаем склад в зависимости от организации
Если ЗначениеЗаполнено(Объект.Организация) Тогда
Объект.Склад = ПолучатьОсновнойСклад(Объект.Организация);
КонецЕсли;
КонецПроцедуры
Функции ПолучатьОрганизациюПоУмолчанию() и ПолучатьОсновнойСклад() нужно реализовать отдельно (например, в общем модуле). Это позволит централизованно управлять логикой.
3.2. Переопределение метода УстановитьЗначенияПоУмолчанию()
Для справочников и документов можно переопределить стандартный метод, который вызывается при создании нового объекта. Пример для справочника Контрагенты:
Процедура УстановитьЗначенияПоУмолчанию()
// Вызываем стандартную обработку
СтандартнаяОбработка = Истина;
// Устанавливаем вид контрагента "Покупатель" по умолчанию
Если Не ЗначениеЗаполнено(ВидКонтрагента) Тогда
ВидКонтрагента = Перечисления.ВидыКонтрагентов.Покупатель;
КонецЕсли;
// Устанавливаем страну "Россия" если не заполнена
Если Не ЗначениеЗаполнено(Страна) Тогда
Страна = Справочники.СтраныМир.НайтиПоНаименованию("Россия");
КонецЕсли;
КонецПроцедуры
Для отладки кода, устанавливающего значения по умолчанию, используйте точку останова в обработчике ПриСозданииНаСервере. Это поможет отследить, какие значения проставляются на каждом этапе и почему могут возникать конфликты.
3.3. Использование параметров сеанса
Иногда значения по умолчанию должны зависеть от параметров сеанса (например, текущего подразделения пользователя). В этом случае удобно использовать механизм параметров сеанса:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем текущее подразделение пользователя из параметров сеанса
ТекущееПодразделение = ПараметрыСеанса.ТекущееПодразделение;
Если ЗначениеЗаполнено(ТекущееПодразделение) Тогда
Объект.Подразделение = ТекущееПодразделение;
КонецЕсли;
КонецПроцедуры
Значения в параметры сеанса обычно устанавливаются при старте системы (в модуле управляемого приложения) или при смене ролей пользователя.
4. Контекстные значения по умолчанию
Самый сложный, но и самый гибкий вариант — когда значение по умолчанию зависит от других реквизитов объекта. Классический пример: подстановка Склада в зависимости от выбранной Организации.
Реализовать это можно двумя способами:
- Через обработчик
ПриИзменении— значение обновляется сразу при изменении родительского реквизита. - Через обработчик
ПередЗаписью— значение проставляется только при записи объекта.
Пример реализации первого подхода для документа РеализацияТоваровУслуг:
Процедура ОрганизацияПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.Организация) Тогда
Объект.Склад = ПолучатьОсновнойСклад(Объект.Организация);
Иначе
Объект.Склад = Неопределено;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при таком подходе значение будет меняться каждый раз при изменении организации, что не всегда удобно. Альтернатива — использовать флаг "уже установлено":
Перем СкладУстановлен;
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СкладУстановлен = Ложь;
КонецПроцедуры
Процедура ОрганизацияПриИзменении(Элемент)
Если Не СкладУстановлен И ЗначениеЗаполнено(Объект.Организация) Тогда
Объект.Склад = ПолучатьОсновнойСклад(Объект.Организация);
СкладУстановлен = Истина;
КонецЕсли;
КонецПроцедуры
Что будет, если не использовать флаг "уже установлено"?
Без флага каждый раз при изменении организации будет сбрасываться склад, даже если пользователь вручную выбрал другой склад. Это приводит к потере пользовательского ввода и раздражению сотрудников.
5. Типовые ошибки и их решения
При работе со значениями по умолчанию разработчики часто сталкиваются с одними и теми же проблемами. Рассмотрим наиболее распространённые ошибки и способы их избежать:
| Ошибка | Причина | Решение |
|---|---|---|
| Значения не проставляются при создании объекта | Ошибка в коде обработчика ПриСозданииНаСервере или конфликт с другими обработчиками |
Проверьте журнал регистрации на ошибки. Используйте отладчик для пошагового выполнения кода |
| "Залипание" старых значений после обновления конфигурации | Кэширование метаданных или некорректное обновление базы | Очистите кэш (1Cv8.1CD с ключом /ClearCache). Выполните тестирование и исправление ИБ |
| Значения проставляются не для всех пользователей | Ошибка в правах доступа или логика зависит от ролей | Проверьте настройки ролей в Администрирование → Пользователи. Используйте ПользователиИнформационнойБазы.ТекущийПользователь() вместо жёстко заданных значений |
| Конфликт значений между конфигуратором и программной логикой | Одно и то же поле настраивается и в конфигураторе, и в коде | Отдайте приоритет программной логике. В обработчике проверяйте Если Не ЗначениеЗаполнено() перед установкой значения |
Особое внимание стоит уделить проблеме "залипания" значений. Она возникает, когда:
- 🔄 В конфигураторе изменяется значение по умолчанию, но в базе остаются старые данные.
- 📥 При обновлении конфигурации не выполняется миграция данных.
- 🔄 Пользователи вручную изменяют значения, но логика программы их сбрасывает.
Для диагностики такой проблемы используйте следующий запрос (пример для документа ПоступлениеТоваровУслуг):
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Ссылка,
ПоступлениеТоваровУслуг.Организация КАК Организация
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ОсновнаяОрганизация)
Всегда тестируйте изменения значений по умолчанию на копии рабочей базы. Особенно если речь идёт о часто используемых документах (заказы, реализации, платежки).
6. Оптимизация производительности
Неправильная реализация механизма значений по умолчанию может значительно замедлить работу системы, особенно в базах с большим количеством пользователей. Рассмотрим ключевые моменты оптимизации:
6.1. Кэширование часто используемых значений
Если для установки значения по умолчанию требуется обращение к справочникам или регистрам (например, поиск основного склада организации), кэшируйте эти значения:
Перем КэшОсновныхСкладов;
Функция ПолучатьОсновнойСклад(Организация)
Если КэшОсновныхСкладов = Неопределено Тогда
КэшОсновныхСкладов = Новый Соответствие;
КонецЕсли;
Если КэшОсновныхСкладов.Содержит(Организация.УникальныйИдентификатор()) Тогда
Возврат КэшОсновныхСкладов.Получить(Организация.УникальныйИдентификатор());
Иначе
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.Организация = &Организация
| И Склады.Основной = ИСТИНА";
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() > 0 Тогда
КэшОсновныхСкладов.Вставить(Организация.УникальныйИдентификатор(), Результат[0].Склад);
Возврат Результат[0].Склад;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
КонецФункции
6.2. Минимизация обращений к базе данных
Избегайте выполнения запросов в обработчиках ПриСозданииНаСервере, если это возможно. Например, вместо:
// Плохо: запрос при каждом создании документа
Объект.Ответственный = Запросы.ПолучитьОтветственногоПользователя();
Лучше использовать:
// Хорошо: значение берётся из параметров сеанса
Объект.Ответственный = ПараметрыСеанса.ТекущийОтветственный;
Параметры сеанса устанавливаются один раз при старте сессии и доступны без дополнительных обращений к базе.
6.3. Использование фоновых заданий для сложной логики
Если логика установки значений по умолчанию требует длительных вычислений (например, анализ истории документов за последний месяц), перенесите её в фоновое задание:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем базовые значения сразу
Объект.Дата = ТекущаяДата();
Объект.Организация = ПолучатьОрганизациюПоУмолчанию();
// Запускаем фоновое задание для сложной логики
ФоновыеЗадания.ДобавитьВОчередь(
"УстановитьДополнительныеЗначенияПоУмолчанию",
Объект.УникальныйИдентификатор()
);
КонецПроцедуры
Само фоновое задание будет выполняться асинхронно и обновлять объект по завершении.
7. Работа со значениями по умолчанию в типовых конфигурациях
В типовых конфигурациях (1С:Бухгалтерия, 1С:УТ, 1С:ЗУП) многие значения по умолчанию уже настроены "из коробки". Однако часто требуется их дополнить или модифицировать под специфику бизнеса.
Рассмотрим особенности работы с популярными конфигурациями:
| Конфигурация | Типовые значения по умолчанию | Частые доработки |
|---|---|---|
| 1С:Бухгалтерия 3.0 | Организация, Касса, Банковский счёт | Подстановка СтатьиДвиженияДенежныхСредств по типу операции |
| 1С:Управление торговлей 11 | Склад, Вид операции, Валюта | Динамический Менеджер в зависимости от клиента |
| 1С:Зарплата и управление персоналом 3.1 | Организация, Подразделение, Должность | Автоматическое проставление Графика работы по должности |
| 1С:ERP 2.4 | Проект, Статья затрат, Номенклатурная группа | Подстановка Центра финансовой ответственности по подразделению |
Для модификации типовых значений рекомендуется использовать расширения конфигурации вместо прямого изменения кода. Это сохранит возможность обновления без потери доработок.
Пример создания расширения для 1С:УТ 11, которое добавляет подстановку менеджера по умолчанию:
- Создайте новое расширение (
Файл → Новое → Расширение конфигурации). - Добавьте в него документ
ЗаказКлиента. - Переопределите обработчик
ПриСозданииНаСервере:
Процедура ПриСозданииНаСервере_Расширение(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Истина; // Вызываем оригинальную процедуру
// Добавляем свою логику
Если Не ЗначениеЗаполнено(Объект.Менеджер) Тогда
Объект.Менеджер = ПолучатьМенеджераПоУмолчанию();
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: В типовых конфигурациях некоторые реквизиты могут иметь сложную логику заполнения (например, Склад в 1С:УТ зависит от настроек торговой точки). Всегда анализируйте существующий код перед внесением изменений.
8. Автоматизация тестирования значений по умолчанию
Чтобы избежать ошибок при установке дефолтных значений, рекомендуется автоматизировать их проверку. Это особенно актуально для крупных проектов с частыми обновлениями.
Можно использовать следующие подходы:
- 🧪 Юнит-тесты — проверка логики в изолированной среде (например, с помощью библиотеки xUnitFor1C).
- 📋 Скрипты проверки — автоматизированное создание объектов и сравнение ожидаемых значений с фактическими.
- 🔍 Журнал регистрации — отслеживание ошибок при установке значений.
Пример простого теста для проверки значений по умолчанию в документе СчётНаОплатуПокупателю:
Процедура ТестироватьЗначенияПоУмолчаниюВСчёте()
// Создаём новый документ
НовыйСчёт = Документы.СчётНаОплатуПокупателю.СоздатьДокумент();
// Проверяем, что организация проставлена
Если НЕ ЗначениеЗаполнено(НовыйСчёт.Организация) Тогда
Сообщить("ОШИБКА: Организация не проставлена по умолчанию!");
Возврат Ложь;
КонецЕсли;
// Проверяем, что дата = текущая дата
Если НЕ НовыйСчёт.Дата = ТекущаяДата() Тогда
Сообщить("ОШИБКА: Дата документа не равна текущей дате!");
Возврат Ложь;
КонецЕсли;
Сообщить("Тест пройден успешно!");
Возврат Истина;
КонецПроцедуры
Для комплексного тестирования можно создать обработку, которая:
- Перебирает все документы и справочники с настройками по умолчанию.
- Создаёт новые объекты каждого типа.
- Сравнивает фактические значения с ожидаемыми (заданными в тесте).
- Формирует отчёт о расхождениях.
Автоматизированное тестирование значений по умолчанию позволяет выявлять регрессии после обновлений конфигурации или изменений в бизнес-логике.
FAQ: Частые вопросы по значениям по умолчанию в 1С
Как сделать, чтобы значение по умолчанию зависело от времени суток?
Используйте функцию ТекущаяДата() с проверкой времени. Пример для установки скидки в документе РеализацияТоваровУслуг:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущееВремя = Час(ТекущаяДата());
Если ТекущееВремя >= 18 И ТекущееВремя < 23 Тогда
Объект.Скидка = 5; // Вечерняя скидка 5%
КонецЕсли;
КонецПроцедуры
Для более сложной логики (например, разные скидки по дням недели) используйте справочник ГрафикиСкидок.
Почему значения по умолчанию не применяются при копировании документа?
При копировании документа (Скопировать()) обработчик ПриСозданииНаСервере не вызывается. Чтобы значения проставлялись и при копировании, используйте обработчик ОбработкаКопирования:
Процедура ОбработкаКопирования(Источник, Цель)
Если Не ЗначениеЗаполнено(Цель.Ответственный) Тогда
Цель.Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
Как задать значение по умолчанию для реквизита табличной части?
Для табличных частей используйте обработчик ПриСозданииНаСервере с добавлением новой строки:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Услуга 1");
НоваяСтрока.Количество = 1;
КонецПроцедуры
Для динамического добавления строк при изменении других реквизитов используйте обработчик ПриИзменении.
Можно ли сделать разные значения по умолчанию для разных ролей?
Да, для этого проверяйте текущую роль пользователя в обработчике:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущиеРоли = ПользователиИнформационнойБазы.ТекущийПользователь().Роли;
Если ТекущиеРоли.Найти("МенеджерПоПродажам") <> Неопределено Тогда
Объект.Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь();
ИначеЕсли ТекущиеРоли.Найти("Логист") <> Неопределено Тогда
Объект.Ответственный = Справочники.Пользователи.НайтиПоНаименованию("Главный логист");
КонецЕсли;
КонецПроцедуры
Альтернативный вариант — использовать разные профили доступа с собственными настройками по умолчанию.
Как отладить код, который устанавливает значения по умолчанию?
Используйте следующие приёмы:
- Установите точку останова в обработчике
ПриСозданииНаСервере. - Проверьте журнал регистрации на ошибки (
Администрирование → Журнал регистрации). - Выводите отладочную информацию в сообщения:
Сообщить("Устанавливаем организацию: " + Объект.Организация); - Используйте Консоль запросов для проверки данных, которые должны подставляться.
Для сложных случаев создайте тестовую обработку, которая эмулирует создание документа с разными входными параметрами.