При разработке или модификации конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартный, казалось бы, код начинает выдавать ошибки при синтаксической проверке. Одной из таких загадочных проблем является ошибка Процедура или функция с указанным именем не определена (Записать). Особенно странно это выглядит в типовых конфигурациях, таких как «Бухгалтерия предприятия 3.0», где код формы не менялся, а изменения касались только состава реквизитов.
В данной статье мы подробно разберем, почему платформа внезапно «забывает» встроенные методы, как на это влияет статус базовой конфигурации и что нужно проверить в редакторе формы в первую очередь.
Для начала проанализируем, откуда в управляемой форме вообще берется метод Записать(). В отличие от глобальных функций, этот метод не является общим для всех типов форм. Он появляется в контексте модуля только тогда, когда форма расширяет возможности какого-либо объекта метаданных (документа, справочника или бизнес-процесса).
Рассмотрим механизм расширений управляемой формы. Когда мы создаем форму документа, платформа автоматически добавляет в неё функциональность, специфичную для документов: кнопки «Провести и закрыть», механизмы работы с датой и номером, и, конечно же, метод Записать(). Но эта связь не является жесткой. Она держится на одном ключевом свойстве — Основном реквизите формы.
Выясним причину ошибки: если у формы нет реквизита, помеченного как основной, или если этот реквизит имеет тип, отличный от ДокументОбъект или СправочникОбъект, форма считается «произвольной». В произвольной форме метода Записать() просто не существует в пространстве имен, доступном компилятору.
Посмотрим на ситуацию, описанную пользователем: в базовой конфигурации при включении возможности редактирования типовой код внезапно перестал проходить проверку. Это происходит по нескольким причинам:
Объект) автоматически теряет этот статус.Проанализируем состав реквизитов формы. Это первое, что нужно сделать при возникновении подобной ошибки. Разберем по шагам:
Объект и имеет тип ДокументОбъект.ИмяВашегоДокумента.Как только вы восстановите статус основного реквизита, платформа заново «подключит» расширение документа к форме, и метод Записать() снова станет узнаваемым для синтаксического контроля.
Посмотрим на текст ошибки из примера: (Проверка: Сервер). Это очень важная деталь. Метод формы Записать() предназначен для вызова на клиенте, так как он инициирует не только запись данных в базу, но и обновление интерфейса, интерактивные проверки и закрытие формы (если требуется).
Если в коде формы вы попытаетесь вызвать Записать() внутри процедуры с директивой &НаСервере, вы получите ошибку, так как на сервере контекст формы ограничен. Рассмотрим пример правильного и неправильного вызова:
// ОШИБОЧНЫЙ ВАРИАНТ
&НаСервере
Процедура СохранитьДанныеНаСервере()
// Этот метод не сработает, так как Записать() - метод расширения формы на клиенте
Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись));
КонецПроцедуры
// ПРАВИЛЬНЫЙ ВАРИАНТ
&НаКлиенте
Процедура ВыполнитьСохранение()
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
Записать(ПараметрыЗаписи);
КонецПроцедуры
Если же вам необходимо выполнить запись объекта именно в серверном контексте (например, внутри процедуры &НаСервереБезКонтекста), то обращаться нужно не к методу формы, а напрямую к объекту данных, используя метод Записать() самого объекта метаданных:
&НаСервере
Процедура ЗаписатьОбъектНаСервере(СсылкаНаДокумент)
ОбъектДок = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
В конфигурации «Бухгалтерия предприятия 3.0» существует специфическая форма ФормаДокументаОднострочная (например, в РКО или ПКО). Она спроектирована для упрощенного ввода данных. Разберем подробнее её специфику: иногда разработчики 1С используют в таких формах динамическое переключение основного реквизита или программное управление элементами. Если вы добавили в документ новый реквизит (например, ЦФО), обязательно убедитесь, что он добавлен в список реквизитов именно этой формы и корректно связан с данными объекта. В противном случае, даже при наличии флага «Основной реквизит», система может давать сбои при инициализации контекста расширения.
Важно помнить о лицензионных ограничениях. Если вы дорабатываете базовую конфигурацию на платформе ПРОФ, вы фактически превращаете её в «кастомную» конфигурацию. Рассмотрим последствия:
.cfu могут возникнуть конфликты, которые потребуют ручного сопоставления объектов.Подводя итог, можно сказать, что ошибка «Метод не определен (Записать)» почти всегда является следствием потери контекста расширения управляемой формы. Чтобы решить проблему, выполните следующие действия:
Объект в списке реквизитов формы.&НаКлиенте.Соблюдение этих правил позволит вам избежать трудностей при модификации типовых решений и обеспечит корректную работу механизмов записи документов в системе 1С:Предприятие.