При работе в программе 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с ситуацией, когда при создании нового документа (например, Заказа покупателя) некоторые поля заполняются «не так, как у всех». Даже после очистки кэша, сброса настроек формы и удаления системных параметров проблема может сохраняться. В этой статье мы подробно разберем, почему это происходит, как работает механизм автоматического заполнения «по последним данным» и как это исправить.
Рассмотрим типовой сценарий: у одного сотрудника в документе ЗаказПокупателя реквизит ВидЗаказа упорно принимает значение «Прочее», в то время как у всей остальной компании по умолчанию устанавливается «Основной». Стандартные действия системного администратора (чистка папки AppData, запуск с ключом /ClearCache, удаление настроек через ХранилищеСистемныхНастроек) в данном случае оказываются бесполезными.
Проанализируем причину: если настройки формы и платформенные кэши чисты, значит, логика заполнения заложена непосредственно в программном коде конфигурации или срабатывают механизмы платформы, связанные с данными в самой базе, а не с локальными файлами пользователя.
Первым делом нам необходимо проверить свойства реквизита в конфигураторе. У многих полей в управляемых формах установлено свойство Заполнять из данных заполнения. Выясним, как это работает:
ВидЗаказа = «Прочее».В этот момент платформа видит активный фильтр и автоматически передает это значение в параметры открытия формы нового объекта. Система считает: «Раз пользователь сейчас смотрит список заказов с видом "Прочее", значит и новый документ он хочет создать именно такого вида». Это стандартное поведение платформы 1С:Предприятие 8.3.
Если же отборов в списке нет, а значение все равно подставляется «неправильное», мы имеем дело со специфической логикой 1С:УНФ. Проанализируем программный код, который отвечает за это поведение. В конфигурации существует общий модуль ЗаполнениеОбъектовУНФ, где описаны функции получения значений по умолчанию.
Рассмотрим пример функции для документа ЗаказПокупателя:
Функция ПолучитьВидЗаказаПокупателя() Экспорт
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьВидыЗаказовПокупателей") Тогда
Возврат Справочники.ВидыЗаказовПокупателей.Основной;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ЗаказПокупателя.ВидЗаказа КАК ВидЗаказа
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|ГДЕ
| ЗаказПокупателя.Автор = &Автор
| И ЗаказПокупателя.ВидЗаказа <> ЗНАЧЕНИЕ(Справочник.ВидыЗаказовПокупателей.ПустаяСсылка)
| И ЗаказПокупателя.ВидОперации <> ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЗаказПокупателя.ЗаказНаряд)
|
|УПОРЯДОЧИТЬ ПО
| ЗаказПокупателя.Дата УБЫВ";
Запрос.УстановитьПараметр("Автор", Пользователи.ТекущийПользователь());
Выборка = Запрос.Выполнить().Выбрать();
// ... дальнейшая логика возврата значения
КонецФункции
Как мы видим из кода, система выполняет запрос к базе данных. Она ищет самый последний по дате документ, созданный текущим пользователем (автором), и берет значение реквизита ВидЗаказа именно оттуда. Это сделано для удобства: если менеджер сегодня вводит поток однотипных заказов одного вида, ему не нужно каждый раз выбирать его вручную.
Понимая работу этого алгоритма, мы можем предложить пользователю простое решение задачи. Чтобы изменить «приоритетное» значение для автоматической подстановки, выполним следующие шаги:
Заказ покупателя.Теперь этот документ станет «самым свежим» в базе для данного автора. При следующем создании нового заказа функция ПолучитьВидЗаказаПокупателя() найдет именно этот документ и подставит значение «Основной» всем последующим новым объектам.
Если вы столкнулись с подобной проблемой в другом документе или конфигурации, и не знаете, откуда берется значение, разберем методику отладки. Иногда точка останова в ПриСозданииНаСервере показывает, что объект уже заполнен, но стек вызовов пуст. В этом случае нам поможет Замер производительности.
Рассмотрим алгоритм действий:
Вы увидите все процедуры, которые вызывались в процессе инициализации объекта. Ищите модули с названиями ЗаполнениеОбъектов..., ОбработкаЗаполнения или ПриУстановкеНовогоНомера. Именно там скрывается логика запросов к «последним» документам автора.
Посмотрим на ситуацию шире. На автоматическое заполнение могут влиять и другие механизмы:
1. Функциональные опции. Как видно в приведенном коде, если опция ИспользоватьВидыЗаказовПокупателей отключена, программа всегда будет возвращать значение «Основной». Если у одного пользователя поведение отличается, проверьте, не ограничены ли его права на просмотр определенных функциональных опций (хотя это редкость для типовых конфигураций).
2. Копирование документов. Если пользователь привык работать через F9 (копирование), то никакие алгоритмы заполнения по умолчанию не работают — данные просто копируются из старого объекта. Если старый объект был с ошибкой, она будет тиражироваться.
3. История выбора. У платформы 8.3 есть механизм История выбора. При нажатии на кнопку выбора в поле, первыми в списке отображаются значения, которые пользователь выбирал чаще всего в последнее время. Иногда это путают с автоматическим заполнением самого поля.
Подведем итог нашего анализа. Если у пользователя некорректно заполняются реквизиты при открытии формы в УНФ:
ЗаполнениеОбъектовУНФ и логику в модуле объекта (процедура ОбработкаЗаполнения).Такой «умный» подход системы к заполнению реквизитов экономит массу времени при массовом вводе данных, но требует понимания логики работы от администраторов и программистов 1С.