Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта. Для этого нужно воспользоваться свойством ПроверкаЗаполнения
, которое есть у реквизитов объектов конфигурации.
Если установить это свойство в значение «Выдавать ошибку», поле Поставщик
в форме будет помечено как обязательное для заполнения. А при записи накладной платформа будет контролировать заполненность этого реквизита. Если реквизит окажется не заполнен, платформа выдаст автоматическое сообщение и запись накладной будет отменена.
Разработчик может повлиять на стандартную проверку заполнения, выполняемую платформой. Для этого у него есть два события:
- Одно событие —
ОбработкаПроверкиЗаполненияНаСервере
— можно обработать в модуле формы. - Другое событие —
ОбработкаПроверкиЗаполнения
— можно обработать в модуле прикладного объекта.
У формы, как правило, есть основной реквизит (редактируемый объект) и могут быть реквизиты, не относящиеся к редактируемому объекту, а являющиеся лишь частью формы:
Поэтому серверное событие формы ОбработкаПроверкиЗаполненияНаСервере
предназначено для проверки заполнения тех реквизитов формы, которые не относятся к редактируемому объекту. Это данные только формы, у формы могут быть свои причины и алгоритмы для проверки этих данных.
Напротив, событие объекта ОбработкаПроверкиЗаполнения
предназначено для для того, чтобы проверить реквизиты основного реквизита формы.
Обработчики обеих событий имеют параметр ПроверяемыеРеквизиты
, в который платформа передает массив имен тех реквизитов, которые подлежат проверке. Если после выхода из обработчика в этом массиве все еще останутся какие-то имена реквизитов — платформа выполнит автоматическую проверку оставшися реквизитов.
Поэтому существует несколько сценариев того, как разработчик может встроить свой алгоритм в механизм проверки заполнения:
- самостоятельно проверить заполненность всех реквизитов и очистить массив
ПроверяемыеРеквизиты
, чтобы платформа не выполняла их проверку - проверить часть реквизитов самостоятельно, удалить их из массива
ПроверяемыеРеквизиты
, а оставшиеся оставить на проверку платформе - добавить в массив
ПроверяемыеРеквизиты
какие-то реквизиты, чтобы платформа проверила и их тоже - вообще отказаться от проверки заполненности реквизитов, очистив массив
Все эти сценарии реализуются довольно просто. Например, чтобы самостоятельно проверить заполненность реквизитов, можно выполнить следующий код:
Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // Проверка остальных реквизитов // .......... // Очистить массив проверяемых реквизитов, чтобы платформа // не выполняла их автоматическую проверку ПроверяемыеРеквизиты.Очистить();
Чтобы проверить лишь часть реквизитов, можно выполнить такой код:
Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; // Удалить поставщика из массива проверяемых реквизитов ИндексПоляПоставщик = ПроверяемыеРеквизиты.Найти("Поставщик"); Если ИндексПоляПоставщик <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексПоляПоставщик); КонецЕсли; КонецЕсли;
Добавить в массив проверяемых реквизитов еще один реквизит можно следующим образом:
ПроверяемыеРеквизиты.Добавить("Комментарий");
А очистить массив проверяемых реквизитов, чтобы ничего не проверять ни самому, ни платформе, можно так:
ПроверяемыеРеквизиты.Очистить();
Вторым параметром в обработчиках этих событий является параметр Отказ
. Если ему присвоить значение Истина
, то после выхода из обработчика дальнейшая запись объекта будет отменена. Таким образом этот параметр нужно устанавливать в значение Истина
тогда, когда ваш алгоритм приходит к выводу, что реквизит не заполнен. В этом случае запись объекта выполнена не будет.
Справка
ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
УправляемаяФорма.ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Отказ
. Тип:Булево
. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значениеИстина
, то запись выполнена не будет. Значение по умолчаниюЛожь
.ПроверяемыеРеквизиты
. Тип:Массив
. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение()
. Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически
. В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения()
модуля объекта.
Позволяет разработчику самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Для формы документа, если при конфигурировании для документа свойство Проведение
установлено в Разрешить
, событие вызывается только при проведении. Если документ не проводится (свойство Проведение
установлено в Запретить
), то вызывается при записи.
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ДокументОбъект.ИмяДокумента.ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Отказ
. Тип:Булево
. Если в теле процедуры-обработчика установить данному параметру значениеИстина
, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчаниюЛожь
.ПроверяемыеРеквизиты
. Тип:Массив
. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение()
. Если для документа при конфигурировании свойство Проведение
установлено в Разрешить
, то вызывается только при проведении. Если документ не проводится (установлено Запретить
), то вызывается при записи.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) // Проверим заполненность реквизита «Покупатель» Покупатель = ПроверяемыеРеквизиты.Найти("Покупатель"); Если Не ЗначениеЗаполнено(Покупатель) Тогда // Если он не заполнен, сообщим об этом пользователю Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!"; Сообщение.Поле = "Покупатель"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); // Сообщим платформе, что мы сами обработали проверку заполнения реквизита «Покупатель» ПроверяемыеРеквизиты.Удалить(Покупатель); // Так как информация не консистентна, то продолжать работу дальше смысла нет Отказ = Истина; КонецЕсли; // Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части «Товары» ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар")); // Обходим строки и проверяем заполнение реквизита Для Индекс = 0 По Товары.Количество()-1 Цикл СтрокаТовар = Товары.Получить(Индекс); Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара"; Сообщение.Поле = "Товары[" + Индекс + "].Товар"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры
Поиск:
1С:Предприятие • Обработка проверки заполнения • Проверяемые реквизиты • Реквизит • Управляемая форма
В этой статье я рассмотрю основные механизмы платформы 1С 8.3, которые обеспечивают проверку заполнения реквизитов.
Проверка заполнения реквизита объекта 1С
У любого реквизита объекта 1С можно настроить проверку заполнения, когда нельзя сохранить новый элемент объекта, не заполнив этот реквизит. Выйдет ошибка.
Для того, чтобы у реквизита объекта осуществлялась проверка заполнения, достаточно в свойстве реквизита «Проверка заполнения» указать значение «Выдавать ошибку».
При таком конфигурировании реквизита, если это реквизит не заполнен, то при попытке записи элемента, выйдет соответствующая ошибка, и запись элемента не будет осуществлена.
Данная проверка будет осуществляться независимо от того, сгенерирована эта форма платформой 1С 8.3 автоматически, или используется форма созданная разработчиком.
Проверка заполнения табличной части в 1С
Помимо реквизитов у объектов можно проверять заполнение табличной части. Для этого у табличных частей объектов имеется свойство «Проверка заполнения», в которое также необходимо установить значение «Выдавать ошибку».
Если в этом случае мы попытаемся записать элемент, в котором будет табличная часть без строк, то выйдет ошибка, и записать элемент не получится.
В тоже время, мы спокойно сможем записать элемент, у которого имеется строка табличной части с пустыми полями.
Если мы хотим проверять реквизиты табличной части, то у них нужно заполнить аналогичное свойство.
Проверка заполнения программно в 1С
Иногда возникает необходимость проверить программно заполнение объекта в 1С. Для этих целей предназначен метод ПроверитьЗаполнение(), который имеется у большинства объектов 1С (справочники, документы и т.д.).
Например, во время программного создания элемента справочника, мы можем проверить заполнение реквизитов этого справочника, перед его записью.
НовОбъект = Справочники.Номенклатура.СоздатьЭлемент(); НовОбъект.Наименование = "Товар"; Если НовОбъект.ПроверитьЗаполнение() Тогда НовОбъект.Записать(); КонецЕсли;
В этом случае, элемент справочника не будет записан, если у него имеются реквизиты, у которых в свойстве ПроверкаЗаполнения установлено значение «Выдавать ошибку».
Иногда, нужно проверить заполнение реквизита, у которого в свойстве «Проверка заполнения» установлено значение «Не проверять». Например, у реквизита Артикул справочника Номенклатура.
Если нам нужно осуществлять проверку этого реквизита (например, по какой-то определенной логике), то необходимо в модуле объекта создать метод ОбработкаПроверкиЗаполнения.
У этого метода, который является процедурой, имеется параметр ПроверяемыеРеквизиты. Этот параметр массив, в котором содержится список имен реквизитов, которые нужно проверять. Если в этот список мы добавим название реквизита, то при сохранении элемента будет осуществляться проверка на то, заполнен этот реквизит или нет.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) ПроверяемыеРеквизиты.Добавить("Артикул"); КонецПроцедуры
Также, мы можем удалить реквизит из проверяемых, если по какой-то причине нет необходимости в проверке заполнения этого реквизита.
Например, удалим из проверяемых реквизит ПолноеНаименование.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) Индекс = ПроверяемыеРеквизиты.Найти("ПолноеНаименование"); Если Индекс <> 0 Тогда ПроверяемыеРеквизиты.Удалить(Индекс); КонецЕсли; КонецПроцедуры
Тогда мы сможем спокойно записать элемент с незаполненным реквизитом ПолноеНаименование.
Если мы хотим проверить программно, что заполнен реквизит табличной части объекта, то необходимо добавить этот реквизит в массив ПроверяемыеРеквизиты по такому формату: [НазваниеТабличнойЧасти].[НазваниеРеквизита] .
Например:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) ПроверяемыеРеквизиты.Добавить("СписокСвойств.НазваниеСвойства"); КонецПроцедуры
В этом случае, будет осуществляться проверка заполнения реквизита табличной части.
Проверка заполнения формы 1С
Иногда нужно проверить заполнение реквизитов формы. Разберем небольшую задачу: будем на форме умножать два числа друг на друга, если они заполнены. Создадим на форме реквизиты с типом Число — Множитель1, Множитель2 и Сумма. У реквизитов Множитель1 и Множитель2 установим в свойство «Проверка заполнения» значение «Выдавать ошибку».
При выполнении команды Посчитать, произведем расчет только в том случае, если реквизиты заполнены. Проверку заполнения будем выполнять при помощи метода ПроверитьЗаполнение.
&НаКлиенте Процедура Посчитать(Команда) Если ПроверитьЗаполнение() Тогда Сумма = Множетель1 * Множетель2; КонецЕсли; КонецПроцедуры
Теперь мы не сможем посчитать сумму, если один из множителей не заполнен.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Как вызвать стандартную проверку заполнения реквизитов?
Код 1C v 8.2 УП
ПроверитьЗаполнение()
Возвращаемое значение:
Тип: Булево. Истина — ошибок не обнаружено, Ложь — в противном случае.
Описание:
Проверяет заполнение реквизитов. Для реквизитов, у которых свойство «Проверка заполнения» установлено в значение «Показывать ошибку» и реквизит не заполнен, будет сформировано сообщение об ошибке.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Код 1C v 8.2 УП
&НаКлиенте
Процедура СформироватьБезСКД(Команда)
// Проверим заполнение обязательных реквизитов
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
СформироватьСервер();
КонецПроцедуры
Обработчик проверки заполнения
У прикладных объектов на платформе 1С Предприятие 8.2 появился новый обработчик события ОбработкаПроверкиЗаполнения, где теперь рекомендуется делать все проверки на заполненность реквизитов объекта. Рассмотрим работу с этим обработчиком. Обработчик должен быть расположен в модуле объекта (для констант в модуле менеджера значений) и имеет следующий синтаксис:
Код 1C v 8.2 УП
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
КонецПроцедуры
Здесь параметр Отказ (тип Булево) отвечает за возможность дальнейшей работы программы после проверки заполнения, а в параметре ПроверяемыеРеквизиты(тип Массив) содержатся реквизиты объекта, которые система будет проверять на заполненность. Напомним, что в версии 1С Предприятие 8.2 появилось возможность на уровне свойств реквизитов объекта устанавливать свойство Проверка заполнения. Так вот в массив ПроверяемыеРеквизиты по умолчанию система помещает реквизиты с установленным свойством «Выдавать ошибку». Однако разработчик может сам некоторые реквизиты добавить в массив или удалить из него в зависимости от каких-либо условий:
Код 1C v 8.2 УП
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Клиент = ПроверяемыеРеквизиты.Найти("Контрагент");
Если Клиент<>Неопределено тогда
ПроверяемыеРеквизиты.Удалить(Клиент);
конецесли;
ПроверяемыеРеквизиты.Добавить("Склад");
КонецПроцедуры
Как видно из примера в качестве элементов массива выступают строковые наименование реквизитов, как они заданы в конфигураторе. Для того чтобы полностью отказаться от системной проверки, необходимо очистить массив. При этом разработчик может проводить проверку реквизитов по произвольным алгоритмам, система же проверяет только на заполненность/незаполненность:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Код 1C v 8.2 УП
ПроверяемыеРеквизиты.Очистить();
Если Контрагент.ПометкаУдаления Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя указывать контрагента, помеченного на удаление!";
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедур
Далее рассмотрим, когда вызывается данный обработчик. Это зависит от типа объекта и его свойств. Так для, например, для справочника обработчик вызывается перед записью объекта; для документа: если разрешено проведение — при проведении, иначе при записи; для обработки : при вызове стандартных команд «OK», Да». Подробно это описано во встроенной справке. Но также есть возможность вызвать данный обработчик в произвольный момент, используя метод объекта ПроверитьЗаполнение(). Например, определить команду Проверить в форме документа:
Код 1C v 8.2 УП
&НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере()
Документ = РеквизитФормыВЗначение("Объект");
Документ.ПроверитьЗаполнение();
КонецПроцедуры
Автор: Борис Захаров
Код 1C v 8.х
//СписокРеквизитов - список значений. Элемент списка значений - имена реквизитов для проверки через запятую.
//Если представление заполнено - считается, что передаются реквизиты табличной части. Пример:
СписокРеквизитовДляПроверки=Новый СписокЗначений;
СписокРеквизитовДляПроверки.Добавить("Контрагент,МестоХранения,ВидОперации");
СписокРеквизитовДляПроверки.Добавить("Номенклатура,Единица,Цена,Количество","ПолнаяТаблица");
СписокРеквизитовДляПроверки.Добавить("ВидОтклонений,Номенклатура,Единица,Серия,Цена,Количество","ТаблицаОтклонений");
Если Не глРеквизитыОбъектаЗаполнены(Источник,СписокРеквизитовДляПроверки) Тогда
Отказ=Истина;
Возврат;
КонецЕсли;
Функция глРеквизитыОбъектаЗаполнены(Объект,СписокРеквизитов) Экспорт
МетаданныеОбъекта=Объект.Метаданные();
МетаданныеТабличныеЧасти=МетаданныеОбъекта.ТабличныеЧасти;
РеквизитыЗаполнены=Истина;
СтрокаДляВыполнения="";
Для каждого НаборРеквизитов Из СписокРеквизитов Цикл
НаименованиеТаблицы=НаборРеквизитов.Представление;
РеквизитыДляПроверки=СтрЗаменить(НаборРеквизитов.Значение,",",Символы.ПС);
ДлинаСпискаРеквизитов=СтрЧислоСтрок(РеквизитыДляПроверки);
Если НаименованиеТаблицы<>"" Тогда
МетаданныеТаблица=МетаданныеТабличныеЧасти[НаименованиеТаблицы];
МетаданныеРевизитыТаблицы=МетаданныеТаблица.Реквизиты;
ТаблицаОбъекта=Объект[НаименованиеТаблицы];
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
МетаданныеРеквизит=МетаданныеРевизитыТаблицы[ИдентРеквизита];
ОписаниеТиповРеквизита=МетаданныеРеквизит.Тип;
ТипыЗначенийРеквизита=ОписаниеТиповРеквизита.Типы();
СтрокаПоиска=ТаблицаОбъекта.Найти(глПолучитьПустоеЗначениеТипа(ТипыЗначенийРеквизита[0]),ИдентРеквизита);
Если СтрокаПоиска=Неопределено Тогда
Продолжить;
КонецЕсли;
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРеквизит.Синоним+""" Табличная часть строка "+СтрокаПоиска.НомерСтроки);
КонецЦикла;
Иначе
Для СчетчикСтрокРевизитов=1 По ДлинаСпискаРеквизитов Цикл
ИдентРеквизита=СтрПолучитьСтроку(РеквизитыДляПроверки,СчетчикСтрокРевизитов);
Если Не ЗначениеЗаполнено(Объект[ИдентРеквизита]) Тогда
МетаданныеРевизитыШапки=МетаданныеОбъекта.Реквизиты;
Попытка
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+МетаданныеРевизитыШапки[ИдентРеквизита].Синоним+"""");
Исключение
Возврат глВозвратЛожьССообщением("Не заполнен реквизит """+ИдентРеквизита+"""");
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Код 1C v 8.х
// Ярослав Волохов aka YVolohov
// Функция проверяет заполнение шапки или табличной части справочника, документа или плана, бизнес-процесса, задачи
// Параметры:
// пИмяТаблицы (строка) - имя табличной части объекта, если не указано то будет проверятся шапка объекта
// пИменаПолей (массив строк) - имена проверяемых реквизитов объекта
// пВыводитьСообщения - если это свойство установлено в "Истина" то будут выводится сообщения в табло о
// незаполненных реквизитах таблицы, если не установлено - то не будут
// пСсылка (ссылка) - ссылка на элемент справочника или плана, документ, по которому будет произведена проверка
// Возвращаемое значение:
// Истина - если все реквизиты найдены и заполнены
// Ложь - если хоть один реквизит не заполнен, табличная часть не найдена
// или хоть один реквизит не найден
Функция ПроверитьЗаполнениеТаблицыОбъекта(пИмяТаблицы = Неопределено,
пИменаПолей, пВыводитьСообщения = Истина, пСсылка) Экспорт
МассивСообщений = Новый Массив;
ЗначениеВозврата = Истина;
МетаданныеОбъекта = пСсылка.Метаданные();
Если НЕ(пИмяТаблицы = Неопределено) Тогда
МетаданныеТаблицы = МетаданныеОбъекта.ТабличныеЧасти.Найти(пИмяТаблицы);
Иначе
МетаданныеТаблицы = МетаданныеОбъекта;
КонецЕсли;
// Проверка существования табличной части
Если НЕ(МетаданныеТаблицы = Неопределено) Тогда
МассивМетаданныхРеквизитов = Новый Массив;
МетаданныеРеквизитов = МетаданныеТаблицы.Реквизиты;
// Проверка существования полей
Для Каждого ИмяПоля Из пИменаПолей Цикл
МетаданныеРеквизита = МетаданныеРеквизитов.Найти(ИмяПоля);
Если НЕ(МетаданныеРеквизита = Неопределено) Тогда
МассивМетаданныхРеквизитов.Добавить(МетаданныеРеквизита);
Иначе
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ИмяПоля + "' не найден !!!");
Иначе
МассивСообщений.Добавить("Реквизит табличной части '" + пИмяТаблицы + "' с именем '" +
ИмяПоля + "' не найден !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
// Проверка заполнения полей
КоличествоСтрокТаблицы = ?(НЕ(пИмяТаблицы = Неопределено), пСсылка[пИмяТаблицы].Количество(), 1);
КоличествоСтрокТаблицы = ?(МассивМетаданныхРеквизитов.Количество() > 0, КоличествоСтрокТаблицы, 0);
// Обход строк таблицы
Для НомерСтрокиТаблицы = 1 По КоличествоСтрокТаблицы Цикл
СтрокаТаблицы = ?(НЕ(пИмяТаблицы = Неопределено),
пСсылка[пИмяТаблицы].Получить(НомерСтрокиТаблицы - 1), пСсылка);
// Обход списка проверяемых реквизитов
Для Каждого ЭлементМетаданныхРеквизитов Из МассивМетаданныхРеквизитов Цикл
// Получение значения ячейки и проверка ее заполнения
ЗначениеЯчейкиТЧ = СтрокаТаблицы[ЭлементМетаданныхРеквизитов.Имя];
ЯчейкаПустая = НЕ(ЗначениеЗаполнено(ЗначениеЯчейкиТЧ));
// Если значение пустое, добавляем сообщение в массив сообщений
Если ЯчейкаПустая Тогда
Если пИмяТаблицы = Неопределено Тогда
МассивСообщений.Добавить("Реквизит шапки с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' не заполнен !!!");
Иначе
МассивСообщений.Добавить("В строке № " + НомерСтрокиТаблицы + " табличной части '" +
пИмяТаблицы + "' не заполнен реквизит с именем '" + ЭлементМетаданныхРеквизитов.Имя + "' !!!");
КонецЕсли;
ЗначениеВозврата = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Иначе
МассивСообщений.Добавить("Табличная часть с именем '" + пИмяТаблицы + "' не найдена !!!");
ЗначениеВозврата = Ложь;
КонецЕсли;
// Здесь выводим все сообщения
Если пВыводитьСообщения Тогда
Для Каждого ТекстСообщения Из МассивСообщений Цикл
Сообщить(ТекстСообщения, СтатусСообщения.Важное);
КонецЦикла;
КонецЕсли;
Возврат ЗначениеВозврата;
КонецФункции
Заполнение дополнительных полей в документе |
Я |
13.04.22 — 04:12
Необходимо сделать доработку, что бы пользователя принудительно заставлять заполнять определенные поля.
Есть идея выдавать запрос. То есть заполнять ряд требуемых полей, по вопросу при закрытии документа.
И показывать эти поля, так же при положительном вопросе. Где это лучше делать? В процедуре ПередЗаписью() ?
То есть пользователь, создает документ. Заполняет его. Потом по «Провести и закрыть», «Записать», «Провести».
В процедуре ПередЗаписью() выдавать ему вопрос, такой то тип документа?
Если нет, то записывается, провидится, закрывается. Сохраняется.
А если да, тогда, снова показывать ему форму, где выделенными становятся дополнительные поля, которые являются обязательными для заполнения.
Как тут лучше сделать?
1 — 13.04.22 — 04:17
Рассматриваю доработку в:
ФормаДокумента.ПередЗаписьюНаСервере()
МодульОбъекта.ПередЗаписью()
2 — 13.04.22 — 04:41
Есть же типовой механизм отметка незаполненного. чем не устраивает?
3 — 13.04.22 — 05:34
(2) Нужна доработка.
Пользователь, как может заполнять эти реквизиты, должен. Так и не нужно ему это делать.
По этому делаю при сохранении документа, проверку.
С выводом вопроса.
Начал делать вот в этой процедуре ФормаДокумента.ПередЗаписьюНаСервере(), но она не подошла. Там не работает Оповещение.
МодульОбъекта.ПередЗаписью() — эта тоже не подойдет, так как выполняется на сервере.
Остается, — ФормаДокумента.ПередЗаписью() &НаКлинете, пробую делать все в ней теперь. Не знаю подойдет ли она.
&НаКлиенте
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Знач ПараметрКоманды) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
//
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Обработка заполнения гос. контракта.»;
Сообщение.Сообщить();
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПараметрКоманды = Неопределено;
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, ПараметрКоманды);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
КонецПроцедуры
4 — 13.04.22 — 05:36
Почему то после вызова вот этой процедуры,
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
идет вызов МодульОбъекта.ПередЗаписью()
а не процедуры указанной в оповещении.
5 — 13.04.22 — 05:44
так Обработчик события ОбработкаПроверкиЗаполнения разве не для этого?
https://its.1c.ru/db/v8std/content/463/hdoc
6 — 13.04.22 — 05:59
(5) как не дать закрыть форму при проведении документа?
7 — 13.04.22 — 06:03
(5) Мне нужно при «Провести и закрыть», «Записать», «Провести», выдавать вопрос пользователю, и если да, не давать закрыть форму документа пока он не заполнит необходимые поля.
Как это сделать? Начал делать вопрос через оповещение, но не пойму как не давать закрыть форму документа.
8 — 13.04.22 — 06:04
(7) зачем всё это?
9 — 13.04.22 — 06:11
(8) Пользователь может забывать заполнить некоторые реквизиты. Они могут заполняться, а могут и не заполняться.
Ему необходительно принудительно напоминать об их заполнении.
10 — 13.04.22 — 06:12
(6) ?
Параметр Отказ мы устанавливаем в значение Истина. Это значит, что документ не будет проведен, если найден хоть один незаполненный реквизит НаборСвойств для номенклатуры, являющейся материалом. Если этот параметр закомментировать, сообщения об ошибке будут выдаваться, но документ будет проведен.
https://its.1c.ru/db/pubdevguide83#content:572:hdoc
11 — 13.04.22 — 06:14
(8) Цель такова, —
Пользователь создал документ.
При «Провести и закрыть», «Записать», «Провести», ему я выдаю вопрос. И если нажать да, то он должен заполнить необходимые поля.
Они могут появиться после этого нажатия. Либо как то ещё,
пока выясняю как не давать закрывать форму, пока не заполнены поля?
12 — 13.04.22 — 06:14
оттуда же
Программная проверка заполнения объектов конфигурации выполняется в обработчике ОбработкаПроверкиЗаполнения(), который нужно поместить в модуле объекта. Этот обработчик вызывается автоматически при сохранении любой формы или при проведении документов. Программную проверку объектов интерактивного ввода нужно делать именно в этом обработчике, а не при записи объекта.
Разве это не твой случай?
13 — 13.04.22 — 06:14
(11) а если надать нет то что?
14 — 13.04.22 — 06:20
(12) Возможно, но не владею информацией, и методами подхода. На данном этапе. Как появится ясность, сделаю это решение.
Пока сам добываю его.
(13) Если пользователь, нажал НЕТ, то обычное «Провести и закрыть», «Записать», «Провести», без преткновений.
Пробую так, —
«Провести и закрыть», «Записать», «Провести»
//
&НаКлиенте
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Отказ) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Закрыть();
Возврат;
КонецЕсли;
//
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Обработка заполнения гос. контракта.»;
Сообщение.Сообщить();
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Отказ = Истина;
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, Отказ);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
КонецПроцедуры
//
15 — 13.04.22 — 06:54
ОФФ. Забыл про паяльник и дверь.
Достаточно не давать записывать незаполненный документ. Но возможность закрывать незаполненный документ должна быть.
16 — 13.04.22 — 07:05
(15) Сейчас этот код при нажатии на нет, ходит по кругу ((( Не давая закрыть форму, хотя должен закрыть и все.
Как его поправить?
17 — 13.04.22 — 07:13
(12) Я вижу в модуле формы процедуру ОбработкаПроверкиЗаполненияНаСервере() вы про неё?
18 — 13.04.22 — 07:14
(17) Там оповещение на сервере наверное нельзя использовать.
19 — 13.04.22 — 07:22
(16) Убери блокировку закрытия незаполненного документа. Это тупиковый путь
20 — 13.04.22 — 07:24
(19) Я хочу что бы, пользователь при «Провести и закрыть», «Записать», «Провести», получал вопрос.
И при нажатии нет, документ выполнял свое «Провести и закрыть», «Записать», «Провести», как и шло.
А если он нажимает, да. То нужно будет ему заполнить некоторые реквизиты обязательно.
21 — 13.04.22 — 07:25
(19) Это в случае, если он нажал да. Форма остается открытой, для заполнения этих реквизитов.
22 — 13.04.22 — 07:27
(21) Третий раз повторю. Это тупиковый путь. Без паяльника и двери не заставишь пользователя заполнить нужные поля. Он такой же упёртый как и ты.
23 — 13.04.22 — 07:28
(22) Пользователь попросил так сделать, я пытаюсь. Ищу способы.
Пользователь заполнил документ, и не подумал про необходимые поля. Записывает его, ему выходит вопрос.
И остается форма если он ответил да. Если нет она закрывается.
Как это сделать?
24 — 13.04.22 — 07:29
Вопрос надо задавать не при закрытии формы, а перед записью
25 — 13.04.22 — 07:29
(22) Вот это тупиковая задача (20) ?
26 — 13.04.22 — 07:31
(25) см (24)
27 — 13.04.22 — 07:33
(26) Понял. Не вовремя увидел (24).
Я делал это в процедуре МодульФормы.ПередЗаписью() .
Но столкнулся с трудностью, как по да, составлять открытой форму, а по нет не препятствовать ее закрытию ?
Нашел код, с примером ПередЗакрытием(), понял он неподходящий.
28 — 13.04.22 — 07:36
(26) Как тут можно выправиться, по да оставлять форму, а по нет закрывать ?
//
&НаКлиенте
//Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Знач ПараметрКоманды) Экспорт
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Отказ) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Отказ = Ложь;
//Закрыть();
Возврат;
КонецЕсли;
//
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Обработка заполнения гос. контракта.»;
Сообщение.Сообщить();
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
//ПараметрКоманды = Неопределено;
//Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, ПараметрКоманды);
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, Отказ);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
q=1;
КонецПроцедуры
//
29 — 13.04.22 — 07:40
(26) При записи, форма документа сразу закрывается. И стоит диалог вопроса, так форма закрылась уже (((.
30 — 13.04.22 — 07:40
(29+) ПередЗаписью() то есть.
31 — 13.04.22 — 07:42
(29) см (2)
32 — 13.04.22 — 07:48
Сейчас я не могу по вопросу, закрыть форму
//
&НаКлиенте
//Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Знач ПараметрКоманды) Экспорт
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Отказ) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Отказ = Ложь;
Возврат;
КонецЕсли;
//
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Обработка заполнения гос. контракта.»;
Сообщение.Сообщить();
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
//ПараметрКоманды = Неопределено;
//Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, ПараметрКоманды);
Отказ = Истина;
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, Отказ);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
q=1;
КонецПроцедуры
//
33 — 13.04.22 — 07:50
(31) Мне нужно задавать вопрос. По нет, закрывать и проводить, записывать. По да, оставлять форму для заполнения, напоминая об этом.
34 — 13.04.22 — 07:51
почему в (32) по нет не закрывается форма?
35 — 13.04.22 — 07:54
(32) Какой смысл копировать сюда один и тот же код?
Процедуру проверки перенеси в обработчик проверки заполнения.
(34) Событии записи не связано с событием закрытия формы. А событие закрытия не должно быть связано с заполнением формы.
…
Начни заново с постановки задачи и поймешь (я надеюсь), что ходишь по кругу из-за непонимания конечной цели.
36 — 13.04.22 — 07:57
(35) В эту процедуру? Оттолкнуло что она выполняется на сервере ОбработкаПроверкиЗаполненияНаСервере()
37 — 13.04.22 — 07:57
38 — 13.04.22 — 08:00
(37) нет доступа
39 — 13.04.22 — 08:00
смотрю примеры сейчас в конфигурации
40 — 13.04.22 — 08:01
(38) Демо доступ на неделю можно получить при регистрации на сайте
41 — 13.04.22 — 08:02
(40) Подскажите по алгоритму. У меня есть сейчас 3 реквизита. Которые нужно заполнить по положительному ответу на вопрос.
Я в модуле документа заполняю массив проверяемых реквизитов и там же задаю вопрос?
42 — 13.04.22 — 08:06
(37) Вы мне показали что нужно поставить галку, проверка заполнения, выбрать в свойстве, выдавать ошибку. Это то мне не подходит.
43 — 13.04.22 — 08:06
(42) Я всё сказал
44 — 13.04.22 — 08:07
(43) Смысл во всем сказанном, если я не сдвинулся с места ?
45 — 13.04.22 — 08:08
(44) см (35) Проблема в тебе
46 — 13.04.22 — 08:08
Завел я доступ посмотрел. И что мне это даст? Я описал уже не раз что мне нужно, и проверка заполнения обычная мне не подходит.
Нужно задавать вопрос, потом только давать заполнять принудительно эти реквизиты, или нет.
47 — 13.04.22 — 08:09
(45) Это тоже никто не оспаривает. И я ищу тут решение, которое можно применить и увидеть результат!!!!!!!
Пока голова моя его не выдала, что пробовал, не завершилось ничем. думаю по другому как быть.
48 — 13.04.22 — 08:10
(46) поверь мне, этот вопрос бесполезен — все будут отвечать так, чтобы не заполнять реквизиты
49 — 13.04.22 — 08:15
(46) «Завел я доступ посмотрел. И что мне это даст?»
Это даст знания. Знания при должном размышлении дадут путь к решению.
50 — 13.04.22 — 08:17
(48) Дело в том что, эти реквизиты, можно заполнять , а можно не заполнять.
Тогда, я вижу такое решение. Но не знаю на сколько оно правильное.
Поле, но не галка. Обязательное для заполнения. А потом уже и реквизиты в зависимости от его заполнения.
А поле это будет, типа список. гос. заказ или не гос заказ. Верно ли так?
Подскажите идею как правильно сделать? Что нужно я описал. И вижу то что тут написал, как один из вариантов.
51 — 13.04.22 — 08:19
Я хотел все решить вопросом, при проведении, записи документа. И дальнейшими действиями, но получается не возможно это сделать.
52 — 13.04.22 — 08:23
(50) Я рад, что ты вернулся к обсуждению постановки задачи. Если реквизит можно не заполнять, то он не является обязательным. В этом случае не должно быть никаких вопросов и предупреждений. Достаточно дать сообщение, что этот реквизит не заполнен.
Поэтому твоё решение является неверным, т.к. необязательность заполнения противоречит ответу на вопрос. Ответ ни на что не влияет, тогда нет смысла его задавать. Достаточно сообщения.
(51) Решать вопросы надо не при проведении или записи, а до того. Либо ограничиться сообщениями. Постарайся убедить в этом заказчика
53 — 13.04.22 — 08:29
от куда вызывается процедура ОбработкаПроверкиЗаполнения() ????
как в Проверяемые реквизиты, добавить значения ? Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
54 — 13.04.22 — 08:31
(52) Ну вот в этом и моя задача теперь, убеждать и объяснять.
Я пока хотел, со слов постановки задача, что либо предпринять.
55 — 13.04.22 — 08:36
(53)
Последовательность запуска событий
Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
2) Модуль формы ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
3) Модуль объекта ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)
Сначала вызывается событие формы ОбработкаПроверкиЗаполненияНаСервере На данном этапе есть доступ к данным формы.
После этого в памяти сервера создается прикладной объект, соответствующий типу основного реквизита формы, и его данные заполняются из данных формы.
Затем вызывается событие прикладного объекта ОбработкаПроверкиЗаполнения.
Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения «Выдавать ошибку»). И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.
Эти два обработчика событий предназначены :
Для включения в проверку заполнения тех реквизитов, у которых в свойствах «ПроверкаЗаполнения» указано «Не проверять». Для этого надо добавить этот реквизит в массив параметр «ПроверяемыеРеквизиты»
Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить этот реквизит из массива параметра «ПроверяемыеРеквизиты»
Имеется несколько особенностей, которые необходимо учитывать:
Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
Вызываются только при интерактивной записи! При программной записи не вызываются. Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
Для документов, имеющих возможность проведения, эти события проверки заполнения вызываются только при проведении!
Если данные формы не нужны, то используйте обработчик модуля объекта ОбработкаПроверкиЗаполнения
https://infostart.ru/1c/articles/1098803/
56 — 13.04.22 — 08:41
как в Проверяемые реквизиты, добавить значения
читай https://www.1s-up.ru/proverka-zapolnenija-v-1s/
57 — 13.04.22 — 08:44
(54) > моя задача теперь, убеждать и объяснять.
Неубедительно.
58 — 13.04.22 — 08:46
(55)(56) Спасибо. Сейчас обдумываю как это провернуть.
59 — 13.04.22 — 08:49
В модуле документа, задаю проверку нужных реквизитов. Исходя из имеющихся на данную минуту знаний.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПроверяемыеРеквизиты.Добавить(«НомерГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ДатаГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ИдентификаторГосКонтракта»);
КонецПроцедуры
потом, в процедуре ПередЗаписью() в модуле объекта, делаю запуск проверки
ПроверитьЗаполнение();
КонецПроцедуры
Это все что я пока понял, что бы это попробовать.
60 — 13.04.22 — 08:53
Вот это само запустится?
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПроверяемыеРеквизиты.Добавить(«НомерГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ДатаГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ИдентификаторГосКонтракта»);
КонецПроцедуры
Или нужно делать
ПроверитьЗаполнение();
КонецПроцедуры
в процедуре ПередЗаписью() модуля документа, обязательно?
Я сам пробую это все. Решил спросить ещё.
61 — 13.04.22 — 08:56
Это запускается само, без ПроверитьЗаполнение();
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПроверяемыеРеквизиты.Добавить(«НомерГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ДатаГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ИдентификаторГосКонтракта»);
КонецПроцедуры
Зачем тогда ПроверитьЗаполнение(); ?
62 — 13.04.22 — 08:59
Подскажите пожалуйста, как в этой процедуре задать вопрос?
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Оповещение в ней не работает. Как это можно сделать?
63 — 13.04.22 — 09:04
Ясно, проверка срабатывает если есть галка в свойствах формы, — ПроверятьЗаполнениеАвтоматически.
Подскажите, а где мне задать можно вопрос, через оповещение?
64 — 13.04.22 — 09:06
Ладно. Спасибо! Сейчас разберусь! Должны прийти идеи!!!! Через галку сделаю! И вопрос, там где это можно задам.
65 — 13.04.22 — 09:35
В модуле документа, —
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЯвляетсяГосКонтрактом Тогда
ПроверяемыеРеквизиты.Добавить(«НомерГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ДатаГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ИдентификаторГосКонтракта»);
КонецЕсли;
КонецПроцедуры
А перед записью в форме
&НаКлиенте
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Знач ПараметрКоманды) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
//
ЯвляетсяГосКонтрактом = Истина;
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПараметрКоманды = Неопределено;
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, ПараметрКоманды);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
КонецПроцедуры
Но если я перепровожу документ, там процедура ОбработкиПроверкиЗаполнения вызывается первой, и никакой вопрос тут не поможет (((
Подскажите, где тогда задавать можно этот вопрос? Что бы устанавливать флаг ЯвляетсяГосКонтрактом ?
66 — 13.04.22 — 09:37
Сейчас у меня задача, выдавать пользователю вопрос, при нажатии на кнопки «Провести и закрыть», «Записать», «Провести»
67 — 13.04.22 — 09:39
Я так понимаю, что только при создании документа, пробовать, выдавать этот вопрос.
68 — 13.04.22 — 09:40
(67) В процедуре ПриОткрытии(), то есть .
69 — 13.04.22 — 09:42
(61) СП Украили? Или по ссылкам не ходил и не читал
Для программного запуска события проверки заполнения
70 — 13.04.22 — 09:43
(0) беда…Не так давно один умелец пихнул вопрос в процедуру ПриПроведении(), а потом долго удивлялся почему регламентное задание, которое создает эти документы и проводит перестало работать))
«Необходимо сделать доработку, что бы пользователя принудительно заставлять заполнять определенные поля» — в этом случае никаких вопросов не нужно! В свойствах этих полей проверку заполнения сделайте проверять и все.
71 — 13.04.22 — 09:44
(69) Это я прочел и уяснил! Спасибо!
72 — 13.04.22 — 09:45
(70) А если документ, типа в котором не нужно заполнять эти поля???? Как избавляться пользователи будут от необходимости их заполнения?
По этому я завязываю на вопрос.
73 — 13.04.22 — 09:45
Если все же решили задавать вопросы юзверам, то делайте это в модуле формы, переопределите кнопки записи/проведения документа и при нажатии их уже проводите проверку и спрашивайте.
74 — 13.04.22 — 09:46
(73) Пока так я не рискую. Буду делать при открытии пробовать, Проверяя на ЭтоНовый()
75 — 13.04.22 — 09:46
(72) тогда для каждого типа документа определите свой пул обязательных реквизитов и при создании на сервере указывайте обязательность заполнения
76 — 13.04.22 — 09:48
(75) Да я , дело в том что в процессе. По текущей, вчера полученной постановке.
Продвигаюсь по мере своего развития.
Новый, как я понял буду определять так, — ЗначениеЗаполнено(Объект.Ссылка) .
77 — 13.04.22 — 09:50
ДокументОбъект.<Имя документа> (DocumentObject.<Document name>)
ЭтоНовый (IsNew)
Синтаксис:
ЭтоНовый()
Возвращаемое значение:
Тип: Булево.
Истина — изменяется еще ни разу не записанный документ; Ложь — документ уже записан.
Описание:
Определяет, записан ли документ в базу данных.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
Если РасходнаяНакладная.ЭтоНовый() Тогда
РасходнаяНакладная.Записать();
КонецЕсли;
Использование в версии:
Доступен, начиная с версии 8.0.
78 — 13.04.22 — 09:51
конфа-то хоть какая? На Управляемых формах, или на обычных?
79 — 13.04.22 — 10:06
&НаКлиенте
Процедура ПроверкаНаГосударственныйКонтракт(Знач Результат, Знач ПараметрКоманды) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
//
ЭтоГосударственныйКонтракт = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Обработка заполнения гос. контракта.»;
Сообщение.Сообщить();
КонецПроцедуры
//
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ВопросУжеЗадавался = Ложь Тогда
Отказ = Истина;
ПараметрКоманды = Неопределено;
ЭтоГосударственныйКонтракт = Ложь;
Оповещение = Новый ОписаниеОповещения(«ПроверкаНаГосударственныйКонтракт», ЭтотОбъект, ПараметрКоманды);
ТекстВопроса = «Это Государственный контракт ?»;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр(«ru = ‘Проверка на государственный контракт'»));
Иначе
Если ЭтоГосударственныйКонтракт ТОгда
Отказ = Истина;
Иначе
Отказ = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
что-то типа этого. Создаем реквизиты на форме ВопросУжеЗадавался и ЭтоГОсударственныйКонтракт. Делаем Записать 2 раза. НА первом проходе ставим Отказ = Истина. Задаем вопрос пользователю, получаем ответ. Затем второй проход, второй раз вызывается ПередЗаписью, но уже без вопроса. А где-то ПередЗакрытием проверяются реквизиты ВопросУжеЗадавался, ЭтоГОсударственныйКонтракт, и в зависимости от них закрываем или не закрываем форму.
80 — 13.04.22 — 10:25
(78) ERP, Управляемые формы.
(77) А как в управляемой форме, воспользоваться ЭтоНовый() ?
81 — 13.04.22 — 10:27
(80) «ДокументОбъект» вам о чем-то говорит?
82 — 13.04.22 — 10:27
(77+) Я в процедуре ПриОткрытии() &НаКлиенте смотрю …
83 — 13.04.22 — 10:28
(82) вот это же черным по белому написано:
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
84 — 13.04.22 — 10:29
это значит вы должны обратиться на сервер и у объекта вызвать данный метод
85 — 13.04.22 — 10:29
(83) Не пойму как мне в процедуре ПриОткрытии() это проделать.
86 — 13.04.22 — 10:29
у вас вообще есть понимание что есть клиент, а что сервер и какие функции они выполняют?
87 — 13.04.22 — 10:30
(84) Я решил что буду смотреть так
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
то же ведь способ. Но как тут ЭтоНовый() применить не понятно.
88 — 13.04.22 — 10:30
(85) наверно создать процедуру/функцию и директивой серверной и попробовать сделать это там? А в вашей ПриОткрытии() вызвать ее
89 — 13.04.22 — 10:32
(88) Ну можно пробовать, серверная функция и там, что там только не могу представить.
90 — 13.04.22 — 11:01
Вопрос такой, по кнопке «Записать» не срабатывает вот эта проверка. Что описано в (55) и (56).
Почему это не срабатывает по кнопке Записать? При Записать, не производится проверка заполнения?
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЯвляетсяГосКонтрактом Тогда
ПроверяемыеРеквизиты.Добавить(«НомерГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ДатаГосКонтракта»);
ПроверяемыеРеквизиты.Добавить(«ИдентификаторГосКонтракта»);
КонецЕсли;
КонецПроцедуры
91 — 13.04.22 — 11:09
Как можно решать проблему того что при записать не происходит проверка реквизитов????
92 — 13.04.22 — 11:10
Это срабатывает при «Провести» и при «Провести и Записать»
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизит
при «Записать» не работает ((((. Получается эта проверка только на проведение?
NIGHTHUNTER
93 — 13.04.22 — 12:02
(92) Получается, что бы это сделать при записать, кнопки только подменять? Как в (73) сказали?
Странно что срабатывает только при проведении.
Содержание:
1. Свойство 1С «Проверка заполнения»
2. Процесс проверки заполнения реквизита
Приветствую, коллеги! В данной статье я расскажу, как проводить программную проверку заполнения реквизита в режиме конфигуратора в 1С. Для начала мы рассмотрим общие понятия, после чего будет показан пример программного кода с комментариями. Также я расскажу, как проводить проверку на заполнение реквизита при помощи специального свойства и в каком случае это работает лучше, чем программная проверка. Всё описанное будет проиллюстрировано на вполне конкретном примере.
1. Свойство 1С «Проверка заполнения»
Чтобы проверить заполнение реквизита в 1С используется специальное свойство – Проверка заполнения. Для всех объектов метаданных, которые имеют типы, а также для реквизитов, которые выступают в стандартном формате, и таблиц, которые обязательно должны быть заполнены, для свойства «Проверка заполнения» должно быть определено значение «Выдавать ошибку».
В некоторых случаях проводить документацию, в которой не заполнены значения в реквизитах и таблицах – не является уместным, так как во время учётов документ не будет иметь отображения. Как пример, рассмотрим документ «Заказ клиента», по сути – это запрос клиента для поставки некоторой продукции в некотором количестве. Согласно определению, не сложно понять, что документ, в котором не заполнены обязательные реквизиты «Клиент» и таблица «Товары» не является корректным и в свойстве «Проверка заполнения» нужно выставить «Выдавать ошибку».
Во время установки свойства «Проверка заполнения» обязательно опираться на то, что все возможные ограничения и сверки нужно прописывать в метаданных внутри конфигурации. Так что когда хоть один из возможных вариантов требует заполнения всех реквизитов, свойство «Проверка заполнения» будет установлено в «Выдавать ошибку». В случае отсутствия обязательных к заполнению реквизитов подобные сценарии должны быть прописаны внутри обработчика «ОбработкаПроверкиЗаполнения».
Стоит отметить, что не нужно создавать противоположную схему: когда свойство «Проверка заполнения» установлено в «Не проверять», а в обработчике «ОбработкаПроверкиЗаполнения» дописаны некоторые проверки по заполнению, так как подобный план станет лишь путать логику в работе в режиме конфигурации 1С.
2. Процесс проверки заполнения реквизита
Бывают случаи, когда при работе в режиме конфигуратора приходится вручную произвести проверку заполнения реквизитов. Когда реквизит имеет специальное свойство «Проверка значения» и при этом имеет значение «Выдавать ошибку», необходимо удалить данный реквизит в массиве проверяемых реквизитов, после чего нужно сверить заполнение реквизита документа при помощи программы, так как это более точный способ. В случае, если проверки в реквизите по умолчанию не было, то стоит программно добавить заданный реквизит в общий массив тех реквизитов, которые подлежат проверке заполнения реквизита.
Проверка по заполнению реквизитов в 1С происходит в обработчике «ОпработкаПроверкиЗаполнения()». Данный обработчик необходимо разместить внутри модуля соответствующего объекта. Его можно вызвать автоматически, когда проводим документацию или сохраняем форму.
Для проверки необходимо запустить модуль документа «ОказаниеУслуги» и поместить в него следующую процедуру:
Рис. 1 Осуществление проверки заполнения реквизита в 1С
Теперь рассмотрим, что именно происходит в данной процедуре.
В начале нам нужно найти и получить реквизит из части таблицы «НаборСвойств», которая находится в массиве «ПроверяемыеРеквизиты». Данный массив будет передан к самому обработчику – в нём и содержатся те реквизиты, которые подлежат проверке. Для всех реквизитов внутри данного реквизита нужно выставить свойство «Проверка заполнения» для значения «Выдавать ошибку». В случае, если он будет распознан и найден, нужно будет удалить его, ведь проверка заполнения реквизитов будет выполняться полностью вручную.
Далее в цикле нужно будет обойти строки внутри табличной части нужного документа, а также провести формировку сообщения, которое будет выводить ошибку лишь для тех случаев, когда данное наименование номенклатуры – это материал, в котором заполнен столбец по набору свойств.
В параметре «Отказ» нужно выставить значение в виде «Истина». Так как данное значение подтверждает, что конкретный документ не подлежит проведению, в случае, когда будет найден хотя бы один реквизит, который не будет заполненным, определится «НабрСвойств», ведь он является материалом. Если сделать комментарий на параметр, то документ будет проводится, но также будут всплывать сообщения об ошибке.
Также вместо «ПереченьНоменклатуры» и «ВидНоменклатуры» можно использовать запросы.
Специалист компании «Кодерлайн»
Айдар Фархутдинов
Проверка заполнения реквизитов
В информационной системе данные могут вноситься множеством различных способов, и часто они могут быть некорректны. Поэтому при разработке решения бывает необходимо прилагать много усилий на реализацию проверки правильности вводимых данных и уведомления пользователя о некорректности введенной информации.
Механизм проверки заполнения позволяет существенно упростить процесс разработки конфигураций.
Платформа поддерживает автоматическую проверку указанных реквизитов прикладных объектов и форм, а также позволяет выполнить процесс проверки в модуле. Для управления проверкой заполнения реквизита служит свойство Проверка заполнения. Если свойство установлено в значение Не проверять – платформа не проверяет заполнение реквизита. Значение Выдавать ошибку указывает на необходимость выполнять проверку.
Платформа выполняет автоматическую проверку заполнения:
● констант;
● справочников, документов, отчетов, обработок, планов видов характеристик, планов счетов, планов видов расчета, бизнес-процессов, задач:
● реквизитов и стандартных реквизитов,
● табличных частей,
● реквизитов и стандартных реквизитов табличных частей;
● наборов записей регистров бухгалтерии, регистра сведений, регистра накопления, регистра расчета, перерасчетов, последовательностей:
● измерений,
● ресурсов,
● реквизитов и стандартных реквизитов;
● реквизитов форм;
● реквизитов форм отчетов;
● реквизитов форм обработок.
ПРИМЕЧАНИЕ. Проверка заполнения реквизитов выполняется аналогично функции ЗначениеЗаполнено(). Проверка заполнения табличных частей подразумевает, что табличная часть считается заполненной, когда в ней присутствует хотя бы одна строка.
Проверка заполнения может быть вызвана двумя способами:
● вызовом метода ПроверитьЗаполнения() (у объекта или формы);
● автоматически.
ВНИМАНИЕ! Если свойство конфигурации Режим совместимости установлено в значение Версия 8.1, то автоматическая проверка заполнения не работает.
Установки по умолчанию
Свойство реквизита Проверка заполнения по умолчанию устанавливается в значение Выдавать ошибку для следующих стандартных реквизитов:
● ПланОбмена – Наименование;
● Справочник – Владелец, Наименование;
● Документ – Дата;
● ПланВидовХарактеристик – Наименование;
● ПланСчетов – Код, Наименование;
● ПланСчетов.ВидыСубконто – ВидСубконто;
● ПланВидовРасчета – Наименование;
● ПланВидовРасчета.ВедущиеВидыРасчета – ВидРасчета;
● ПланВидовРасчета.БазовыеВидыРасчета – ВидРасчета;
● ПланВидовРасчета.ВытесняющиеВидыРасчета – ВидРасчета;
● РегистрСведений – Период;
● РегистрНакопления – Период;
● РегистрБухгалтерии – Период;
● РегистрРасчета – ПериодРегистрации, ВидРасчета, ПериодДействияНачало, ПериодДействияКонец;
● БизнесПроцесс – Дата;
● Задача – Наименование.
Порядок работы
Автоматическая проверка заполнения вызывается расширением формы перед интерактивной записью всех объектов, кроме документов, бизнес-
процессов, отчетов и обработок. Для этих объектов определено следующее поведение:
● для документов:
● проверка заполнения вызывается расширением формы перед проведением, если свойство Проведение установлено в значение Разрешить;
● проверка заполнения вызывается расширением формы перед записью, если свойство Проведение установлено в значение Запретить;
● для бизнес-процессов проверка заполнения вызывается расширением формы перед стартом;
● для отчетов проверка заполнения вызывается расширением формы при нажатии кнопки Сформировать;
● для обработок проверка заполнения вызывается расширением формы в случаях, если нажаты кнопки, связанные со стандартными командами формы OK, Да, Повторить, Пропустить.
Если реквизит является основным реквизитом формы следующих типов: СправочникОбъект, ДокументОбъект, ОтчетОбъект,
ПланВидовХарактеристикОбъект, ПланСчетовОбъект, ПланВидовРасчетовОбъект, БизнесПроцессОбъект, ЗадачаОбъект, то для значения такого реквизита
также будет вызвана проверка заполнения.
Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство Проверять заполнение автоматически. В этом случае вначале будет вызван обработчик ОбработкаПроверкиЗаполненияНаСервере() формы, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.
ВНИМАНИЕ! Если у формы свойство Проверять заполнение автоматически установлено в значение Истина при выполнении стандартных команд Записать (Провести для документов и т. д.), а также стандартных команд формы OK, Да, Повторить, Пропустить, будет вызван метод ПроверитьЗаполнение(). В противном случае проверка заполнения не вызывается ни для формы, ни для объекта.
Процесс проверки заполнения происходит следующим образом:
● Формируется список имен реквизитов формы, для которых возможна проверка заполнения и для которых свойство ПроверкаЗаполнения установлено в значение ВыдаватьОшибку. В этот список не будут включены имена реквизитов, тип которых не поддерживает проверку заполнения (например, СправочникОбъект), но будет включено имя основного реквизита формы.
В автоматически формируемый список реквизитов не будут включены реквизиты формы, отключенные с помощью функциональных опций.
● Вызывается обработчик события формы ОбработкаПроверкиЗаполненияНаСервере, в котором разработчик может описать свой алгоритм проверки заполнения или изменить состав проверяемых реквизитов. В обработчик будет передан сформированный список имен реквизитов. Если в обработчике необходимо добавить к списку какие-либо реквизиты, это можно сделать только для реквизитов вышеперечисленных типов (для
которых возможна проверка заполнения в форме) и основного реквизита. Добавление в список имен реквизитов объектного типа (например, СправочникОбъект) вызовет исключение при дальнейшей автоматической проверке. Добавление в список имени несуществующего реквизита вызовет исключение при дальнейшей автоматической проверке.
● После завершения работы обработчика события механизм проверки заполнения получает обратно список имен, проверяемых реквизитом (который, возможно, был изменен в обработчике). Система анализирует список реквизитов и проверяет заполненность каждого реквизита. Если реквизиттявляется основным реквизитом объектного типа (например, Объект типа СправочникОбъект), будет вызвана проверка заполнения самого объекта.
Если реквизит является реквизитом объектного типа, но не основным, будет вызвано исключение.
Разработчик имеет возможность влиять на процесс проверки путем определения в модуле объекта, набора записей и в модуле формы обработчика события ОбработкаПроверкиЗаполнения.
Определив обработчик события, разработчик получает полный контроль над проверкой заполнения. В параметре ПроверяемыеРеквизиты обработчик получает массив реквизитов, для которых в режиме Конфигуратор указано, что они должны проверяться. Разработчик может произвольно модифицировать этот массив:
● удалять те реквизиты, проверку заполнения которых он реализует сам или считает, что их не нужно проверять в данный момент;
● добавлять необходимые реквизиты, для которых должна выполниться проверка заполнения.
В случае если разработчика не устраивает стандартная процедура проверки, он может написать алгоритм проверки сам и, используя объект СообщениеПользователю, сообщить об имеющихся проблемах пользователю.
Если в процессе проверки разработчик вывел пользователю сообщения об ошибках, необходимо установить параметр Отказ в значение Истина, чтобы уведомить платформу о том, что текущее действие не может быть завершено.
Параметр события ПроверяемыеРеквизиты содержит имена атрибутов в следующем формате:
● для реквизитов и констант – ИмяРеквизита, например, Поставщик;
● для табличных частей – ИмяТабличнойЧасти, например, Товары;
● для реквизитов табличных частей – ИмяТабличнойЧасти.ИмяРеквизита, например, Товары.Номенклатура;
● для реквизитов форм – ИмяРеквизита, например, ДокументОбъект.
Для реквизитов, входящих в состав функциональных опций без параметров, значение опции учитывается при проверке заполнения. Если функциональная опция включена, то реквизит будет включен в список проверяемых реквизитов; если опция выключена, реквизит не будет включен в список проверяемых реквизитов. Это значит, что отключенное поле не будет передано через параметры ПроверяемыеРеквизиты в
ОбработкаПроверкиЗаполнения.
Реквизиты, входящие в состав функциональной опции с параметрами , всегда включаются в список проверяемых реквизитов (параметр ПроверяемыеРеквизиты). Удаление реквизита из списка проверяемых реквизитов в таких случаях необходимо выполнять в обработчике ОбработкаПроверкиЗаполнения. Для этого следует получить значение функциональной опции, указав в качестве параметров необходимые данные
объекта.
Правила отображения отметки незаполненного
На отображение отметки незаполненного влияют следующие свойства элементов конфигурации:
● свойство Проверка заполнения реквизита или стандартного реквизита объекта метаданных;
● свойство Проверка заполнения реквизита формы;
● свойство Автоотметка незаполненного элемента формы;
● свойство ОтметкаНезаполненного элемента формы (доступно только для программного изменения).
Свойство элемента формы Автоотметка незаполненного может быть установлено в значение:
● Авто – отметка будет отображаться, если у реквизита формы или реквизита (стандартного реквизита) объекта метаданных свойство Проверка заполнения установлено в значение Выдавать ошибку и реквизит, связанный с элементом формы, содержит пустое значение.
● Да – отметка будет отображаться для незаполненного элемента вне зависимости от того, в каком состоянии находится свойство Проверка
заполнения.
● Нет – отметка не будет отображаться для незаполненного элемента вне зависимости от того, в каком состоянии находится свойство Проверка заполнения.
При начале интерактивного изменения поля ввода отметка незаполненного перестает отображаться, при этом значение свойства ОтметкаНезаполненного не изменяется. Отображение отметки восстанавливается (если это необходимо) после того, как в поле ввода завершено интерактивное редактирование или установлено значение. При этом свойство ОтметкаНезаполненного может быть изменено системой в том случае, если
свойство АвтоОтметкаНезаполненного установлено в значение Истина:
● если значение в поле не заполнено, то свойство ОтметкаНезаполненного будет установлено в значение Истина;
● если в поле значение заполнено, то свойство ОтметкаНезаполненного будет установлено в значение Ложь.
ПРИМЕЧАНИЕ. Если свойство ОтметкаНезаполненного установлено у таблицы, то для таблицы, в которой нет строк, будет подсвечена первая строка, а для заполненной таблицы – все строки.
Кроме того, отметка незаполненного также будет отображена, если в окне сообщений есть сообщение , связанное с конкретным полем формы, вне зависимости от установленных свойств элемента формы и связанных с ним реквизитов. После очистки окна сообщений отметка незаполненного снимается у тех элементов формы, значение свойства ОтметкаНезаполненного которых равно значению Ложь.
Занятие 27 851
Можно также программно добавить реквизит в массив проверяемых реквизитов (листинг 27.5).
Листинг 27.5. Добавление реквизита в массив проверяемых реквизитов
ПроверяемыеРеквизиты.Добавить(«ПереченьНоменклатуры.НаборСвойств»);
Использование параметризованных команд
Использование параметризованных команд в формах объектов позволяет при выполнении команды передать в обработчик команды какой-либо параметр, например значение ссылочного реквизита. И затем использовать его, например, открыть с этим параметром форму отчета.
Для примера создадим команду открытия отчета, показывающего остатки материалов по складу, указанному в документе. Отчет будет вызываться из формы документа ОказаниеУслуги, в него будет передаваться значение реквизита документа Склад, и при открытии отчета в настройки отчета будет добавляться отбор по параметру
Склад.
В режиме «Конфигуратор»
Сначала создадим параметризованную команду объекта конфигу-
рации Отчет Материалы.
Для этого откроем окно редактирования этого объекта. На закладке Команды нажмем кнопку Добавить и создадим команду Остат-
киПоСкладу.
В открывшейся палитре свойств зададим Тип параметра команды –
СправочникСсылка.Склады. В свойстве Группа укажем Командная панель формы.Важное (рис. 27.37).
Таким образом, мы создали команду с типом параметра СправочникСсылка.Склады, и теперь во всех формах, имеющих реквизит такого типа, эта команда автоматически будет добавлена в список параметризуемых команд, доступных в форме.
852 1С:Предприятие 8.3. Практическое пособие разработчика
Рис. 27.37. Создание параметризованной команды
В открывшемся модуле команды заполним обработчик для ее выполнения следующим образом (листинг 27.6).
Листинг 27.6. Обработчик параметризованной команды
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура(«Отбор, КлючНазначенияИспользования, СформироватьПриОткрытии», Новый Структура(«Склад», ПараметрКоманды), «ОстаткиПоСкладу», Истина);
ОткрытьФорму(«Отчет.Материалы.Форма», ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, Истина, ПараметрыВыполненияКоманды.Окно);
КонецПроцедуры
Прокомментируем этот код.
Занятие 27 853
В процедуру ОбработкаКоманды() передается ПараметрКоманды,
содержащий значение типа СправочникСсылка.Склады. Затем создается структура параметров формы (ПараметрыФормы): Отбор,
КлючНазначенияИспользования, СформироватьПриОткрытии.
В параметр Отбор добавляется структура, содержащая элемент Склад со значением, содержащимся в параметре команды
(ПараметрКоманды), параметр КлючНазначенияИспользования –
«ОстаткиПоСкладу» определяет назначение использования формы, а параметру СформироватьПриОткрытии присваивается значение Истина, чтобы отчет формировался сразу после открытия.
Затем структура параметров формы передается в глобальный метод ОткрытьФорму(), и форма, указанная в первом параметре метода, открывается с параметром Склад. Причем поскольку в четвертом параметре Уникальность этого метода передается Истина, то при открытии формы каждый раз будет открываться новая форма отчета и отчет будет заново сформирован с отбором по складу, переданному в параметре команды.
Теперь поместим нашу команду в форму документа.
Как мы уже говорили, в формах документов ПриходнаяНакладная
и ОказаниеУслуги содержится команда ОстаткиПоСкладу, так как они имеют реквизит Склад типа СправочникСсылка.Склады.
Откроем форму документа ОказаниеУслуги.
На закладке Команды перейдем в раздел Глобальные команды. Здесь мы видим список глобальных параметризуемых команд, доступных в форме. В группе Параметризуемые раскроем строку
Объект и перетащим нашу команду Отчет.Материалы.Команда.ОстаткиПоСкладу(Объект.Склад) в командную панель элементов формы.
В скобках у команды указано значение реквизита Склад (Объект.Склад), которое будет передаваться в команду при ее выпол-
нении (рис. 27.38).
Заметьте, что мы не создавали форму отчета и не добавляли в настройки отчета отбор по параметру формы Склад. Система сделает это сама при выполнении обработчика команды ОстаткиПо-
Складу.
854 1С:Предприятие 8.3. Практическое пособие разработчика
Рис. 27.38. Помещение параметризованной команды в форму
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и откроем документ
Оказание услуги № ЦБ000000001.
Нажмем кнопку Остатки по складу и вызовем отчет Материалы. Форма отчета генерируется системой автоматически. Отчет будет выполнен сразу при открытии формы с отбором по складу Основной, указанному в форме документа (рис. 27.39).
Закроем отчет. Если в форме документа мы изменим склад на Розничный, а затем выполним отчет нажатием кнопки Остатки по складу, то он будет сформирован с отбором по складу Розничный (в данном случае отчет будет пустой, так как у нас нет движений материалов по этому складу).
Таким образом, мы создали для пользователя очень удобную возможность – открывать отчет, показывающий остатки материалов по складу, прямо из формы документа с отбором по указанному в документе складу.
Занятие 27 855
Рис. 27.39. Отчет «Материалы» с отбором по складу, указанному в документе
Открытие формы списка с заданным отбором
В заключение рассмотрим распространенный случай, когда требуется открыть форму списка с некоторым заранее установленным отбором. На этом же примере мы поясним различие между фиксированными (программными) пользовательскими настройками и настройками динамического списка, сделанными в конфигураторе.
Предположим, из списка сотрудников нам нужно открыть список документов об оказании услуг, выполненных сотрудником, который выделен в форме списка.
Похожую задачу мы уже решали с помощью критерия отбора и механизма ввода на основании (см. раздел «Получение объектов, введенных на основании» на стр. 811). Теперь выполним ее с помощью встроенного языка.
В режиме «Конфигуратор»
Итак, нам нужно открыть форму списка документов Оказание услуги с отбором по мастеру, в котором поле Мастер будет равно ссылке на текущего сотрудника в списке сотрудников.
Для этого создадим форму списка справочника Сотрудники, затем создадим в ней команду ОказаниеУслуг и перетащим ее в командную
856 1С:Предприятие 8.3. Практическое пособие разработчика
панель формы. В палитре свойств команды ОказаниеУслуг, в строке Действие создадим клиентский обработчик этой команды
(рис. 27.40).
Рис. 27.40. Форма списка справочника «Сотрудники»
В модуле формы заполним обработчик команды следующим образом
(листинг 27.7).
Листинг 27.7. Обработчик команды «Оказание услуг»
&НаКлиенте Процедура ОказаниеУслуг(Команда)
ПараметрыФормы = Новый Структура( «Отбор», Новый Структура(«Мастер», Элементы.Список.ТекущаяСтрока));
ОткрытьФорму(«Документ.ОказаниеУслуги.ФормаСписка», ПараметрыФормы,, Истина);
КонецПроцедуры
Этот код очень похож на предыдущий листинг 27.6, в котором открывалась форма отчета с отбором по значению параметризованной команды. Только здесь в значение отбора для поля Мастер передается ссылка на текущий элемент списка сотрудников, которая содержится в свойстве ТекущаяСтрока таблицы формы Список, отображающей данные динамического списка. Затем этот отбор передается в параметры формы при открытии формы списка документов
Оказание услуги.
Занятие 27 857
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» и откроем список сотрудников. В форме списка появилась кнопка Оказание услуг. При ее нажатии открывается список документов об оказании услуг, где мастером является текущий сотрудник (рис. 27.41).
Рис. 27.41. Отбор по мастеру в списке документов «Оказание услуги»
Однако не все так просто, как может показаться. Здесь есть одна тонкость, которую нужно знать и учитывать при создании настроек (в частности, отборов) динамических списков.
Как уже говорилось, динамический список построен на основе системы компоновки данных. Настройки списка при открытии формы помещаются в свойство динамического списка Компонов-
щикНастроек.
Следует различать три вида настроек динамического списка:
Фиксированные настройки, сделанные программным путем, помещаются в свойство динамического списка КомпоновщикНа-
строек.ФиксированныеНастройки;
Настройки, сделанные в конфигураторе, помещаются в свойство динамического списка КомпоновщикНастроек.Настройки;
Пользовательские настройки, сделанные в режиме 1С:Предприятие, помещаются в свойство динамического списка Компо-
новщикНастроек.ПользовательскиеНастройки.
858 1С:Предприятие 8.3. Практическое пособие разработчика
Пользовательские настройки загружаются из системного хранилища и накладываются на настройки, сделанные в конфигураторе. В случае пересечения этих настроек пользовательские настройки имеют больший приоритет, то есть «затирают» настройки конфигуратора.
Затем к полученным настройкам применяются фиксированные настройки. Но в случае пересечения этих настроек будет выдаваться ошибка. Например, при открытии формы списка с отбором (в нашем случае по полю Мастер) этот отбор помещается в фиксированные настройки. Поэтому пользователь уже не сможет установить отбор списка по тому же полю.
Таким образом, если пользователь должен иметь возможность создаватьотборпополю,участвующемувфиксированныхнастройках списка, нужно удалить отбор из коллекции фиксированных настроек
(КомпоновщикНастроек.ФиксированныеНастройки.Отбор) и добавить этот отбор в коллекцию основных настроек списка (КомпоновщикНа-
строек.Настройки.Отбор).
В режиме «Конфигуратор»
Чтобы решить поставленную задачу, откроем форму списка документа ОказаниеУслуги, которую мы создали ранее. В редакторе формы создадим реквизиты формы ПрограммныйОтбор типа Булево и два реквизита произвольного типа – ПолеОтбора и ЗначениеОтбора. Эти реквизиты будут хранить информацию о программном отборе в форме списка.
Затем создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 27.8).
Листинг 27.8. Обработчик события формы «ПриСозданииНаСервере»
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Отбор.Свойство(«Мастер») Тогда ПрограммныйОтбор = Истина; ПолеОтбора = Новый ПолеКомпоновкиДанных(«Мастер»);
Параметры.Отбор.Свойство(«Мастер», ЗначениеОтбора); КонецЕсли
КонецПроцедуры
Занятие 27 859
При создании формы списка с помощью коллекции параметров формы мы проверяем, был ли установлен отбор по полю Мастер. Если такой отбор установлен, то мы устанавливаем признак того, что форма была открыта с программным отбором, реквизит ПолеОтбора устанавливаем как поле компоновки данных с именем Мастер, а в реквизит ЗначениеОтбора помещаем соответствующее значение отбора из коллекции параметров формы.
Далее создадим обработчик события формы ПриОткрытии и заполним его следующим образом (листинг 27.9).
Листинг 27.9. Обработчик события формы «ПриОткрытии»
&НаКлиенте Процедура ПриОткрытии(Отказ)
Если ПрограммныйОтбор = Истина Тогда ПрограммныеНастройки = Список.КомпоновщикНастроек.ФиксированныеНастройки;
Для Каждого ЭлементНастроек Из ПрограммныеНастройки.Отбор.Элементы Цикл Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда
ПрограммныеНастройки.Отбор.Элементы.Удалить(ЭлементНастроек); КонецЕсли;
КонецЦикла;
Настройки = Список.КомпоновщикНастроек.Настройки;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = ПолеОтбора; ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); КонецЕсли;
КонецПроцедуры
Код обработчика выполняется в случае, если форма была открыта с программным отбором.
Сначала обходится коллекция элементов отбора фиксированных настроек компоновщика настроек динамического списка. Если в коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора (т. е. установлен программный отбор по полю Мастер), то этот элемент удаляется.
Затем этот же отбор добавляется в коллекцию настроек динамиче-
ского списка КомпоновщикНастроек.Настройки.Отбор, и измененные настройки загружаются в компоновщик настроек.
860 1С:Предприятие 8.3. Практическое пособие разработчика
Теперь осталось только удалить созданный элемент отбора при закрытии формы списка документа ОказаниеУслуги.
Для этого создадим обработчик события формы ПередЗакрытием и заполним его следующим образом (листинг 27.10).
Листинг 27.10. Обработчик события формы «ПередЗакрытием»
&НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если ПрограммныйОтбор = Истина Тогда Настройки = Список.КомпоновщикНастроек.Настройки;
Для Каждого ЭлементНастроек Из Настройки.Отбор.Элементы Цикл Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда
Настройки.Отбор.Элементы.Удалить(ЭлементНастроек); КонецЕсли;
КонецЦикла; Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецЕсли;
КонецПроцедуры
Код обработчика выполняется в случае, если форма была открыта с программным отбором.
Коллекция элементов отбора настроек компоновщика настроек дина-
мического списка КомпоновщикНастроек.Настройки.Отбор обходится в цикле. Если в коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора, то этот элемент удаляется. Затем измененные настройки загружаются в компоновщик настроек.
В режиме «1С:Предприятие»
Запустим «1С:Предприятие», откроем список сотрудников и нажмем кнопку Оказание услуг. Откроется список документов об оказании услуг, где мастером является текущий сотрудник. Вызовем окно настройки списка, выполнив команду Еще Настроить список… В открывшемся окне мы видим добавленный нами отбор по полю Мастер, который пользователь может изменить или очистить
(рис. 27.42).
Соседние файлы в папке Учебники
- #
- #
- #
- #
- #
- #