Процедура ОбработкаПроверкиЗаполнения |
Я |
22.09.16 — 14:38
Всем привет ситуация такая создал «Функциональные опции» «ИспользованиеСкладаВтабличнойЧастиДокумнета»
и когда скрываю склад при проведении выдаёт ошибку
Ошибка при выполнении обработчика — ‘ОбработкаПроведения’
по причине:
{Документ.ПриходнаяНакладная.МодульОбъекта(76)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать(Истина);
по причине:
Запись не верна! Значение поля «Склад» не может быть пустым! (Регистр накопления: Товары на складах; Номер строки
Полскажите что делать?
1 — 22.09.16 — 14:41
и причем тут ОбработкаПроверкиЗаполнения?
2 — 22.09.16 — 14:43
заполнить склад!
3 — 22.09.16 — 14:45
(2) Склад скрыт, как его заполнить?
4 — 22.09.16 — 14:45
например, программно
5 — 22.09.16 — 14:48
(4) как?
6 — 22.09.16 — 14:49
(5) Запись.Склад = МойСклад;
7 — 22.09.16 — 14:55
(3) «Склад скрыт, как его заполнить?» // Осознание проблемы пришло?
8 — 22.09.16 — 14:57
(7) Склад скрыт через»Функциональные опции» но при проведении документа ошибка что склад не заполнен
9 — 22.09.16 — 14:58
(8) то, что скрыт — понятно. а вас спрашивают — он заполнен или нет?
10 — 22.09.16 — 14:59
(8) Какой вывод из этого делаешь?
11 — 22.09.16 — 15:00
(9) Нет не заполнен
12 — 22.09.16 — 15:11
(0)
…
<ПроверяемыеРеквизиты>
Тип: Массив.
Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам
13 — 22.09.16 — 15:13
(11) о чем программа и сообщает. верно?
14 — 22.09.16 — 15:21
(13) Верно
15 — 22.09.16 — 15:22
(13) Он на такие «провокационные» вопросы не отвечает, см. (10) 🙂
16 — 22.09.16 — 15:24
(12)Мимо
17 — 22.09.16 — 15:26
(14) отсюда напрашивается простой вывод — реквизит надо заполнить. Сокрытие реквизита _в_документе_ не отменяет необходимость заполнения реквизита _в_регистре_
18 — 22.09.16 — 15:30
(17) Тогда как его заполнить
И в принципе зачем его заполнять если он не нужен
Нельзя его как-то удалить?
19 — 22.09.16 — 15:32
(16) А, ну да, у него регистр
20 — 22.09.16 — 15:33
(18) Ды грохни в конфигураторе, делов-то
21 — 22.09.16 — 15:37
(20)Научишь щас, он ведь правда грохнет
22 — 22.09.16 — 15:38
(18) заполнить — например, программно.
То, что «не нужен» — это вряд ли. Но если вы уверены в том, что он не нужен — удаляйтте из регистра, или, по крайней мере, снимите запрет незаполненых значений. Но тут уж сам себе злобный буратино…
23 — 22.09.16 — 15:38
(21) говорят, что правило «не давать обезьянам гранату» отменили…
24 — 22.09.16 — 15:40
Название регистра тока поменяй тогда:)
25 — 22.09.16 — 15:40
(22) Сказали сделать не удаляя и не снимая запрет, поэтому я и спрашиваю
26 — 22.09.16 — 15:45
Чувак, у тебя ФО называется «ИспользованиеСкладаВТабличнойЧасти» а не «НеИспользоватьСкладВобще». Кроме табличной части у документа есть еще и шапка.
27 — 22.09.16 — 15:47
(26) Какая разница какое название?
28 — 22.09.16 — 15:50
(27)Перелогинься, седня еще не пятница
29 — 22.09.16 — 15:52
(28) ?
30 — 22.09.16 — 15:55
(28) «Мизда. пятница каждый день»©
31 — 22.09.16 — 16:22
поле Склад регистра Товары на складах включен в состав функциональной опции?
32 — 22.09.16 — 18:04
(31) Да
33 — 23.09.16 — 15:53
Ребята как сделать что если функциональная опция отключена удалить реквизит склад?
34 — 23.09.16 — 16:00
перед записью документа, если опция включена, то проставлять склад в тч из шапки
35 — 23.09.16 — 16:05
(0) пятнично.. включай опцию, заполняй склад в документе, потом выключай. и склад заполнен, и виден не будет
36 — 23.09.16 — 16:07
(35) как я сам не догадался
37 — 23.09.16 — 17:14
(33) Сколько платят за решение вопроса?
38 — 26.09.16 — 09:07
(37) в каком смысле сколько платят?
39 — 26.09.16 — 09:12
(38) По вашему, этот вопрос может иметь несколько смысловых значений?
40 — 26.09.16 — 09:16
(39) по моему 2 смысла
сколько мне плотят за это или сколько я плачу
41 — 26.09.16 — 09:18
(39) ответы на вопрос: Пьете ли вы водку на Новый год?
— Не понял вопроса… — 13%
— В каком смысле? — 18%
— Обычную водку? — 23%
— Как понять «пьете водку»? — 22%
— Все вышеперечисленное — 24%
©
42 — 26.09.16 — 09:19
(40) вообще-то это два разных слова. Плот и плакать.
43 — 26.09.16 — 09:22
(42) Маркс и Энгельс — это два разных человека. а Слава КПСС — вообще не человек, а лозунг
44 — 26.09.16 — 09:37
(41) А где вариант «Единая Россия» — 46% ?
45 — 26.09.16 — 09:47
(40) ладно, бесплатный совет. Щелкаешь по полю номенклатура, и перевыбираешь ее. Потом радуешься.
46 — 26.09.16 — 17:35
(40) Правильно. Мы же не знаем, исполнитель ли ты или конечный заказчик.
Если ты — исполнитель, то поделись, сколько тебе платят за решение этого вопроса.
Ну а если ты заказчик, то тут и так понятно (сколько предлагаешь типа).
47 — 26.09.16 — 17:48
(46) я исполнитель но мне платят не за заказ у меня месячный оклад
и подкинули вот такое левое задание
48 — 26.09.16 — 17:53
(47) Почему «левое»? У тебя должность там не «программист 1С» что ли?
49 — 26.09.16 — 17:53
(48) стажёр 1С
50 — 26.09.16 — 18:28
Какая конфа то?
51 — 27.09.16 — 08:46
(50) дали какую-то самописную конфу
52 — 27.09.16 — 08:59
(51) ты ведь заметил, что ошибка у тебя в регистре ТоварыНаСкладах? А ты нам про табличную часть документа талдычишь. Причем тут табличная часть?
53 — 27.09.16 — 09:03
(52) да как бы ни причём
54 — 27.09.16 — 09:20
(53) ты забыл заполнить поле склад в регистре. В этом ошибка. А то что там скрыто и не скрыто в табличной части, какая разница, зачем нам это?
55 — 27.09.16 — 09:24
(53) и там таких регистров штук 20. И в каждом есть склад. Это тебе сегодня на целый день работенка движения регистров переписывать. Так что ты не тормози, соберись и в темпе, чтобы успеть.
56 — 27.09.16 — 09:58
Скажите как получить значение Ф.О?
57 — 27.09.16 — 15:15
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ИспользованиеСклада = ПолучитьФункциональнуюОпцию(«ИспользованиеСклада»);
ИспользованиеСклада = ПроверяемыеРеквизиты.Найти(«Склад»);
Если Не ИспользованиеСклада (ложь) Тогда
Массив = Новый Массив;
Массив.Добавить(«Склад»);
Индекс = Массив.Найти(«Склад»);
Массив.Удалить(Индекс);
Массив.Очистить()
КонецЕсли;
КонецПроцедуры
в чёи ошибка? Что ещё нужно дописать сюда?
58 — 27.09.16 — 15:16
простите
В чём ошибка?*
59 — 27.09.16 — 15:22
(58) «в ДНК!»©
60 — 27.09.16 — 15:34
(59) Leck mich am Arsch

61 — 27.09.16 — 15:43
(60) 🙂
62 — 27.09.16 — 15:50
(57) можно Рамзану Кадырову в твиттер написать. Он решит эту проблему.
63 — 27.09.16 — 15:58
Слушай, ну ты же явный гуманитарий, если за 5 дней так и не смог решить задачу. Ну нахрен тебе это программирование? Не мучай свое естество.
64 — 27.09.16 — 16:05
(63) Какая тебе нахрен разница что мне нужно? я же не говорю тебе что делать
65 — 27.09.16 — 16:45
(57) «ИспользованиеСклада = ПроверяемыеРеквизиты.Найти(«Склад»);
Массив = Новый Массив;
Массив.Добавить(«Склад»); » это всё удалить надо
66 — 27.09.16 — 16:50
Народ а есть здесь функция редактирования отправленного сообщения?
67 — 27.09.16 — 16:53
(66) Нет. Пиши так, чтобы не было стыдно
68 — 27.09.16 — 16:55
(67) спасибо, буду знать на будущее)
69 — 27.09.16 — 16:58
(67) А что за дебаты здесь происходят?
«Sv4org» хочет что-бы ему помогли,но никак не может вкурить что делать, я правильно понимаю?
70 — 27.09.16 — 17:01
(64) ты разницу понимаешь между документом и регистром? в (57) у тебя проверка документа, а в (0) ошибка в регистре.
71 — 27.09.16 — 17:03
(70) в (57) этот код написан в модуле набора записей регистра
hhhh
72 — 27.09.16 — 19:48
(71) в (57) полностью бред написан. Просто какой-то набор букв.
Всем привет ситуация такая создал «Функциональные опции» «ИспользованиеСкладаВтабличнойЧасти» и когда скрываю склад при проведении выдаёт ошибку
Ошибка при выполнении обработчика — ‘ОбработкаПроведения’ по причине: {Документ.ПриходнаяНакладная.МодульОбъекта(76)}: Ошибка при вызове метода контекста (Записать) НаборЗаписей.Записать(Истина); по причине: Запись не верна! Значение поля «Склад» не может быть пустым! (Регистр накопления: Товары на складах; Номер строки
Знаю что надо где-то рыть в «Процедура ОбработкаПроверкиЗаполнения»
Вот написал часть кода а что дальше делать не пойму
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Склад = ПроверяемыеРеквизиты.Найти(«Склад»);
Если Не ЗначениеЗаполнено(Справочники.Склады) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = «Не указан Склад!»;
Сообщение.Поле = «Покупатель»;
Сообщение.УстановитьДанные(ЭтотОбъект);
ПроверяемыеРеквизиты.Удалить(Склад);
Отказ = Истина;
КонецЕсли;
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(«Ссылк.Товар»));
Яещё новичок подскажите что делать? Заренее спаисбо!
Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта. Для этого нужно воспользоваться свойством ПроверкаЗаполнения, которое есть у реквизитов объектов конфигурации.
Если установить это свойство в значение «Выдавать ошибку», поле Поставщик в форме будет помечено как обязательное для заполнения. А при записи накладной платформа будет контролировать заполненность этого реквизита. Если реквизит окажется не заполнен, платформа выдаст автоматическое сообщение и запись накладной будет отменена.
Разработчик может повлиять на стандартную проверку заполнения, выполняемую платформой. Для этого у него есть два события:
- Одно событие —
ОбработкаПроверкиЗаполненияНаСервере— можно обработать в модуле формы. - Другое событие —
ОбработкаПроверкиЗаполнения— можно обработать в модуле прикладного объекта.
У формы, как правило, есть основной реквизит (редактируемый объект) и могут быть реквизиты, не относящиеся к редактируемому объекту, а являющиеся лишь частью формы:
Поэтому серверное событие формы ОбработкаПроверкиЗаполненияНаСервере предназначено для проверки заполнения тех реквизитов формы, которые не относятся к редактируемому объекту. Это данные только формы, у формы могут быть свои причины и алгоритмы для проверки этих данных.
Напротив, событие объекта ОбработкаПроверкиЗаполнения предназначено для для того, чтобы проверить реквизиты основного реквизита формы.
Обработчики обеих событий имеют параметр ПроверяемыеРеквизиты, в который платформа передает массив имен тех реквизитов, которые подлежат проверке. Если после выхода из обработчика в этом массиве все еще останутся какие-то имена реквизитов — платформа выполнит автоматическую проверку оставшися реквизитов.
Поэтому существует несколько сценариев того, как разработчик может встроить свой алгоритм в механизм проверки заполнения:
- самостоятельно проверить заполненность всех реквизитов и очистить массив
ПроверяемыеРеквизиты, чтобы платформа не выполняла их проверку - проверить часть реквизитов самостоятельно, удалить их из массива
ПроверяемыеРеквизиты, а оставшиеся оставить на проверку платформе - добавить в массив
ПроверяемыеРеквизитыкакие-то реквизиты, чтобы платформа проверила и их тоже - вообще отказаться от проверки заполненности реквизитов, очистив массив
Все эти сценарии реализуются довольно просто. Например, чтобы самостоятельно проверить заполненность реквизитов, можно выполнить следующий код:
Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // Проверка остальных реквизитов // .......... // Очистить массив проверяемых реквизитов, чтобы платформа // не выполняла их автоматическую проверку ПроверяемыеРеквизиты.Очистить();
Чтобы проверить лишь часть реквизитов, можно выполнить такой код:
Если Поставщик = Справочники.Поставщики.ПустаяСсылка() Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Необходимо заполнить поставщика!"; Сообщение.Поле = "Поставщик"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; // Удалить поставщика из массива проверяемых реквизитов ИндексПоляПоставщик = ПроверяемыеРеквизиты.Найти("Поставщик"); Если ИндексПоляПоставщик <> Неопределено Тогда ПроверяемыеРеквизиты.Удалить(ИндексПоляПоставщик); КонецЕсли; КонецЕсли;
Добавить в массив проверяемых реквизитов еще один реквизит можно следующим образом:
ПроверяемыеРеквизиты.Добавить("Комментарий");
А очистить массив проверяемых реквизитов, чтобы ничего не проверять ни самому, ни платформе, можно так:
ПроверяемыеРеквизиты.Очистить();
Вторым параметром в обработчиках этих событий является параметр Отказ. Если ему присвоить значение Истина, то после выхода из обработчика дальнейшая запись объекта будет отменена. Таким образом этот параметр нужно устанавливать в значение Истина тогда, когда ваш алгоритм приходит к выводу, что реквизит не заполнен. В этом случае запись объекта выполнена не будет.
Справка
ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
УправляемаяФорма.ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Отказ. Тип:Булево. Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значениеИстина, то запись выполнена не будет. Значение по умолчаниюЛожь.ПроверяемыеРеквизиты. Тип:Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение(). Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически. В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.
Позволяет разработчику самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Для формы документа, если при конфигурировании для документа свойство Проведение установлено в Разрешить, событие вызывается только при проведении. Если документ не проводится (свойство Проведение установлено в Запретить), то вызывается при записи.
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ДокументОбъект.ИмяДокумента.ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Отказ. Тип:Булево. Если в теле процедуры-обработчика установить данному параметру значениеИстина, то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчаниюЛожь.ПроверяемыеРеквизиты. Тип:Массив. Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение(). Если для документа при конфигурировании свойство Проведение установлено в Разрешить, то вызывается только при проведении. Если документ не проводится (установлено Запретить), то вызывается при записи.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) // Проверим заполненность реквизита «Покупатель» Покупатель = ПроверяемыеРеквизиты.Найти("Покупатель"); Если Не ЗначениеЗаполнено(Покупатель) Тогда // Если он не заполнен, сообщим об этом пользователю Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!"; Сообщение.Поле = "Покупатель"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); // Сообщим платформе, что мы сами обработали проверку заполнения реквизита «Покупатель» ПроверяемыеРеквизиты.Удалить(Покупатель); // Так как информация не консистентна, то продолжать работу дальше смысла нет Отказ = Истина; КонецЕсли; // Сообщим платформе, что мы сами обрабатываем проверку реквизита товар в табличной части «Товары» ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Товары.Товар")); // Обходим строки и проверяем заполнение реквизита Для Индекс = 0 По Товары.Количество()-1 Цикл СтрокаТовар = Товары.Получить(Индекс); Если Не ЗначениеЗаполнено(СтрокаТовар.Товар) Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "В строке " + Индекс + " не заполнено значение товара"; Сообщение.Поле = "Товары[" + Индекс + "].Товар"; Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры
Поиск:
1С:Предприятие • Обработка проверки заполнения • Проверяемые реквизиты • Реквизит • Управляемая форма
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1.1. В данном обработчике модуля объекта выполняются действия, связанные с проверкой правильности заполнения значений реквизитов объектов (измерений, ресурсов, реквизитов табличных частей и т.п., далее: просто «реквизиты»).
1.2. Данным обработчиком следует пользоваться в случаях, когда для проверки корректности значений реквизитов обычной проверки на заполненность уже недостаточно (например, значение реквизита логически связано со значением другого реквизита), или же требование к тому, чтобы значение реквизита было заполнено не является безусловным.
Если проверка заполнения какого-либо реквизита — условная (т.е. зависит от значений других реквизитов или значения параметризированной функциональной опции) в обработчике следует предусмотреть код, который удаляет имя такого реквизита из массива проверяемых реквизитов ПроверяемыеРеквизиты . В общем виде, схема проверки заполнения выглядит следующим образом:
- создать массив НепроверяемыеРеквизиты ;
- в процессе проверки условий, добавлять в этот массив имена непроверяемых реквизитов (табличных частей);
- вызвать процедуру для удаления непроверяемых реквизитов (текст процедуры УдалитьНепроверяемыеРеквизитыИзМассива приведен ниже).
При этом не рекомендуется использовать другие схемы проверки заполнения значений реквизитов, так как они затрудняют анализ логики работы конфигурации, поскольку скрывают из свойства «Проверка заполнения» случаи условной проверки заполнения значений объектов.
Например, неправильно:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
// Значение реквизита не должно быть пустым в зависимости от значения другого реквизита
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
// Для индивидуального предпринимателя должно быть сопоставлено физ. лицо
ПроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
НепроверяемыеРеквизиты = Новый Массив();
.
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
НепроверяемыеРеквизиты.Добавить(«ИНН»);
КонецЕсли;
.
// Значение реквизита не должно быть пустым в зависимости от другого реквизита
Если ЮрФизЛицо <> Перечисления.ЮрФизЛицо.ФизЛицо Тогда
НепроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
// перед удалением реквизита из массива необходимо проверить, что он там есть
// (не был удален ранее платформой или в коде).
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
1.3. Следует учитывать, что обработчик ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта, в частности, он не вызывается в случаях если запись были инициирована программно.
Методическая рекомендация (полезный совет)
1.4. В случае использования в конфигурации подсистемы «Обмен данными» Библиотеки стандартных подсистем обработчик ОбработкаПроверкиЗаполнения вызывается при проведении документов, после их загрузки из сообщения обмена. Для отключения некоторых проверок в этом режиме в обработчике можно анализировать дополнительное свойство объекта ДополнительныеСвойства . ОтложенноеПроведение .
2.1. Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта. Поскольку в случае некорректного заполнения объекта выполнение операции будет прервано еще до записи объекта в базу данных, то размещение проверок в этом обработчике является наиболее эффективным.
При выполнении внетранзакционных проверок в обработчике ОбработкаПроверкиЗаполнения необходимо учитывать тот факт, что новое состояние объекта еще не записано. Если требуется выполнить запрос к тем или иным данным системы, например, прочитать признак ВидНоменклатуры для товаров, выбранных в табличной части документа, «отталкиваясь» от данных документа, то такую поверку можно выполнить, применяя сохранение необходимых для запроса данных во временные таблицы.
2.2. В то же время, в обработчике ОбработкаПроверкиЗаполнения не следует размещать проверки, которые должны гарантировать целостное состояние объекта или зависящих от него данных (например, движений) на которые рассчитывает система. Поэтому для реквизитов, некорректные значения которых могут привести к рассогласованности данных в информационной базе, проверку корректности следует выполнять в обработчиках событий, возникающих в транзакции записи — ПередЗаписью , ПриЗаписи , ОбработкаПроведения (для документов).
Для транзакционных проверок, в свою очередь, выделяются два случая:
- Проверка состояния движений, формируемых документами оперативного учета. Такие проверки довольно часто встречаются в приложениях с оперативным учетом.
- Проверка состояния других объектов информационной базы, ссылки на которых содержатся в текущем объекте. Такие проверки следует применять очень редко. Не следует злоупотреблять количеством проверок в транзакции записи объекта. Следует помнить, что внутри транзакции записи имеет смысл выполнять только проверки таких ресурсов или таких правил соответствия объектов друг другу, которые не изменяются без проверок всеми участниками процесса.
В первом случае, проверку остатков некоторого ресурса имеет смысл выполнять в транзакции записи только в том случае, если все документы выполняют такую же проверку в транзакции записи. Если хоть один из документов, изменяющих ресурс, делает это без проверок, выполнение проверок другими участниками процесса бессмысленно и такие проверки необходимо выполнять вне транзакции. Исключением может быть только случай, когда документ, который выполняет изменение контролируемого ресурса без проверок, вводится крайне редко. Например, не смотря на то, что документ «Инвентаризация товаров» изменяет остатки товаров без проверок, эта ситуация допустима в виду того, что он вводится крайне редко. Каждое такое исключение из правила должно быть оправданным.
Во втором случае, если при записи Подразделения в транзакции записи выполняется проверка, что сотрудник, выбранный в качестве руководителя подразделения, имеет должность «Руководитель», то при записи Сотрудника также должна выполняться и «встречная» проверка этого же правила: нельзя записать Сотрудника с должностью отличной от «Руководитель», если он указан руководителем того или иного подразделения. Поскольку правило, что «Сотрудник», выбранный руководителем подразделения, должен иметь должность «Руководитель», может быть нарушено как при записи подразделения, так и при записи сотрудника, то и проверка должна выполняться или в транзакции записи обоих объектов, или вне транзакции записи обоих объектов (а может и не выполняться вообще).
Механизм проверки заполнения позволяет автоматически проверить, заполнены ли указанные реквизиты объекта. Для этого нужно воспользоваться свойством ПроверкаЗаполнения , которое есть у реквизитов объектов конфигурации.

Если установить это свойство в значение «Выдавать ошибку», поле Поставщик в форме будет помечено как обязательное для заполнения. А при записи накладной платформа будет контролировать заполненность этого реквизита. Если реквизит окажется не заполнен, платформа выдаст автоматическое сообщение и запись накладной будет отменена.
Разработчик может повлиять на стандартную проверку заполнения, выполняемую платформой. Для этого у него есть два события:
- Одно событие — ОбработкаПроверкиЗаполненияНаСервере — можно обработать в модуле формы.
- Другое событие — ОбработкаПроверкиЗаполнения — можно обработать в модуле прикладного объекта.

У формы, как правило, есть основной реквизит (редактируемый объект) и могут быть реквизиты, не относящиеся к редактируемому объекту, а являющиеся лишь частью формы:

Поэтому серверное событие формы ОбработкаПроверкиЗаполненияНаСервере предназначено для проверки заполнения тех реквизитов формы, которые не относятся к редактируемому объекту. Это данные только формы, у формы могут быть свои причины и алгоритмы для проверки этих данных.
Напротив, событие объекта ОбработкаПроверкиЗаполнения предназначено для для того, чтобы проверить реквизиты основного реквизита формы.
Обработчики обеих событий имеют параметр ПроверяемыеРеквизиты , в который платформа передает массив имен тех реквизитов, которые подлежат проверке. Если после выхода из обработчика в этом массиве все еще останутся какие-то имена реквизитов — платформа выполнит автоматическую проверку оставшися реквизитов.
Поэтому существует несколько сценариев того, как разработчик может встроить свой алгоритм в механизм проверки заполнения:
- самостоятельно проверить заполненность всех реквизитов и очистить массив ПроверяемыеРеквизиты , чтобы платформа не выполняла их проверку
- проверить часть реквизитов самостоятельно, удалить их из массива ПроверяемыеРеквизиты , а оставшиеся оставить на проверку платформе
- добавить в массив ПроверяемыеРеквизиты какие-то реквизиты, чтобы платформа проверила и их тоже
- вообще отказаться от проверки заполненности реквизитов, очистив массив
Все эти сценарии реализуются довольно просто. Например, чтобы самостоятельно проверить заполненность реквизитов, можно выполнить следующий код:
Чтобы проверить лишь часть реквизитов, можно выполнить такой код:
Добавить в массив проверяемых реквизитов еще один реквизит можно следующим образом:
А очистить массив проверяемых реквизитов, чтобы ничего не проверять ни самому, ни платформе, можно так:
Вторым параметром в обработчиках этих событий является параметр Отказ . Если ему присвоить значение Истина , то после выхода из обработчика дальнейшая запись объекта будет отменена. Таким образом этот параметр нужно устанавливать в значение Истина тогда, когда ваш алгоритм приходит к выводу, что реквизит не заполнен. В этом случае запись объекта выполнена не будет.
Содержание
- Справка
- ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
- ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
- Похожие FAQ
- Еще в этой же категории
- Рекомендуем к прочтению
Справка
ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
- Отказ . Тип: Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , то запись выполнена не будет. Значение по умолчанию Ложь .
- ПроверяемыеРеквизиты . Тип: Массив . Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение() . Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически . В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.
Позволяет разработчику самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Для формы документа, если при конфигурировании для документа свойство Проведение установлено в Разрешить , событие вызывается только при проведении. Если документ не проводится (свойство Проведение установлено в Запретить ), то вызывается при записи.
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
- Отказ . Тип: Булево . Если в теле процедуры-обработчика установить данному параметру значение Истина , то будет выполнен отказ от продолжения работы после выполнения проверки заполнения. Значение по умолчанию Ложь .
- ПроверяемыеРеквизиты . Тип: Массив . Массив путей к реквизитам, для которых будет выполнена проверка заполнения. Массив может быть модифицирован удалением или добавлением путей к необходимым реквизитам.
Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме, а также при выполнении метода ПроверитьЗаполнение() . Если для документа при конфигурировании свойство Проведение установлено в Разрешить , то вызывается только при проведении. Если документ не проводится (установлено Запретить ), то вызывается при записи.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
Функция проверяет заполненность реквизитов объекта
Как вызвать стандартную проверку заполнения реквизитов?
Код 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.х
Код 1C v 8.х

Похожие FAQ
Еще в этой же категории
Заполнение списка значений в элементе поле выбора на форме 9
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип — Произвольный, Использование — Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Форма
Программное создание таблицы значений с условным оформлением 6
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Форма
Как активизировать, перевести фокус на необходимый элемент на форме? 6
//Текущему Элементу формы присваиваем элемент котровый необходимо активизировать ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличноеПоле; Форма
Программное добавление элементов на форму 6
ЭлементыФормы (Controls) . Добавить (Add) — Добавляет элемент управления на форму. Синтаксис: Добавить( Тип , Имя , Видимость , ПоместитьНа ) Параметры: Тип (обязательный) Тип: Тип. Тип добавляемого элемента управления: Индикатор; П Поле выбора
Как ограничить список выбора? 5
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Доброго времени. Написал обработку , которая добавляет информацию в спровочник номенклатура. А именно заполняет 2 таб части. Ошибок нет. Обработка отрабатывает до конца. Но данные не записываются. Сделал вторую обработку где на форме выбираю что записать и куда. Все работает. Даже вот эта часть кода не изменяет наименование элемента справочники. Я уже даже реквизит на форму вытащил. его заполняю, потом получаю объект и меняю. все так же. в чем может быть дело? спасибо.
Всё не читал, но, может, подписка на событие?
находишь л_Инструмент, объект получаешь у НомИнструмент
просто элемент формы под названием «НомИнструмент» связан с реквизитом формы по имени «НомИнструмент» только и делов то.
Нахожу. Присваиваю элементы формы. Потом с формы получаю объект. Это уже от безысходности. Естественно этого не было в начально версии)))
Самое интересное что отладчик видит все изменения. Но в момент записи ничего не происходит
тогда попробуй посмотреть что в советуют
если нет записи значит была ошибка. если нет ошибки — она где то глотается, в конструкции Попытка — Исключение — КонецПопытки. Есть такие?
и в модуле объекта процедуры передзаписью и призаписи
а еще как вариант есть внешняя транзакция, которая тихо откатывается.
Вот такой код работает в тойже конфе
смотреть внимательно сообщение можно увидеть весь код?
Можно но как поможет?)) Для каждого СтрокаТ из ТЗ цикл
а внутри СоздатьНоменклатуру объект записывается или нет?
Но ошибка даже до этого .. просто при смене Наименования. В самом начале
какая еще ошибка. ты же в пишешь: «Ошибок нет. Обработка отрабатывает до конца. »
в общем все, чем ты наполняешь объект в функции СоздатьНоменклатуру благополучно пройоппывается, объект не создается и думаю, что валится на л_ИнструментОб.Наименование = л_ИнструментОб.Наименование + «*»; так как объект не создан.
Ну точнее не ошибка. А вот эта история с тем что не записывается док
Блин. Я там прерываю обработку сразу после смены наименования. Он дальше до СоздатьНоменклатуру не доходит
так ты даже не справочник пытаешься записать, а док?
у меня мозги уже свернулись. Справочник конечно. НЕ придерайтесь)
Код не проходит нормоконтроль платформы, поэтому не работает ничего.
сделай чтобы функция СоздатьНоменклатуру возвращала ссылку, а не объект
Блин. Прервать стоит выше. Чем создатьноменклатуру
я тестирую на номенклатуре которая есть.
так и было. Я на форму вынес уже потом.
Упростил вот так не работает тоже…
Нахожу первый код в ТЗ . По коду нахожу номенклатуру. меняю наименование. Записываю
Смысл тот же. что за Зерня?!
Для каждого СтрокаТ из ТЗ цикл
Первый раз такое вижу просто.. Сейчас перезалью базу в другую… Хз даже что думать тут
ну где-то транзакция у вас. и она отменена. а если так? л_НоменОбъект.ОбменДанными.Загрузка = Истина; л_НоменОбъект.Записать;
Проверю сейчас бэкапится база
и можно увидеть проц ПриЗаписи(Отказ) и ПередЗаписью(Отказ)
обычно ж сообщение вылезает. Почему отказ..
это название предопределенных, возможно в модуле они у вас просто ПриЗаписи
убрал прервать. убрал цикл вообще. 1 хрен
УтроДоброе.. Вот это не работает. Это работает. В чем беда?)
Ошибка при выполнении обработчика — ‘ОбработкаПроверкиЗаполнения’ по причине: {Справочник.Номенклатура.МодульОбъекта}: Ошибка при вызове метода контекста (ЭтоНовый) по причине: Элемент не выбран!
Как он не выбран если форма открыта и я в ней жму записать!?!?!?
Нашел закономерность.. У меня данные для номенклатуры берутся из файла ЭКсель. Если я комментирую кусок где заполняется таблица из Экселя то все работает. Если заполнение ТЗ из Экселя заполняется то Номенклатура не записывается. В чем может быть дело??? Вот так работает вот так не работает. даже если я так же получаю номенклатуру по коду не обращаясь к таблице заполненной из Экселя.. Шо за хрень!?!
Код Скопипастил из обработки другой.. Тот что заполняет таблицу по Экселю.. А там не заметил НАчатьТранзакцию Ну ппцц…
Формум то действительно Волшебный!)
Про транзакции сказали в самом начале
дак.. Пока кусками комментить не стал код.. И не понял в чем дело. И не видел начала транзакции , .
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Можно попробовать использовать команду ВОЗВРАТ при невыполнении условия проверки, без использования команды ОТКАЗ.
Чтоб документ не проводился — вам всего лишь нужно не выполнить процедуру ОбработкаПроведения до конца, прервать ее в нужном вам месте. Значение флажка ОТКАЗ на это никак не влияет
Обработчик события ОбработкаПроверкиЗаполнения
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1.1. В данном обработчике модуля объекта выполняются действия, связанные с проверкой правильности заполнения значений реквизитов объектов (измерений, ресурсов, реквизитов табличных частей и т.п., далее: просто «реквизиты»).
1.2. Данным обработчиком следует пользоваться в случаях, когда для проверки корректности значений реквизитов обычной проверки на заполненность уже недостаточно (например, значение реквизита логически связано со значением другого реквизита), или же требование к тому, чтобы значение реквизита было заполнено не является безусловным.
Если проверка заполнения какого-либо реквизита — условная (т.е. зависит от значений других реквизитов или значения параметризированной функциональной опции) в обработчике следует предусмотреть код, который удаляет имя такого реквизита из массива проверяемых реквизитов ПроверяемыеРеквизиты . В общем виде, схема проверки заполнения выглядит следующим образом:
- создать массив НепроверяемыеРеквизиты ;
- в процессе проверки условий, добавлять в этот массив имена непроверяемых реквизитов (табличных частей);
- вызвать процедуру для удаления непроверяемых реквизитов (текст процедуры УдалитьНепроверяемыеРеквизитыИзМассива приведен ниже).
При этом не рекомендуется использовать другие схемы проверки заполнения значений реквизитов, так как они затрудняют анализ логики работы конфигурации, поскольку скрывают из свойства «Проверка заполнения» случаи условной проверки заполнения значений объектов.
Например, неправильно:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
// Значение реквизита не должно быть пустым в зависимости от значения другого реквизита
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
// Для индивидуального предпринимателя должно быть сопоставлено физ. лицо
ПроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
НепроверяемыеРеквизиты = Новый Массив();
.
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
НепроверяемыеРеквизиты.Добавить(«ИНН»);
КонецЕсли;
.
// Значение реквизита не должно быть пустым в зависимости от другого реквизита
Если ЮрФизЛицо <> Перечисления.ЮрФизЛицо.ФизЛицо Тогда
НепроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
// перед удалением реквизита из массива необходимо проверить, что он там есть
// (не был удален ранее платформой или в коде).
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
1.3. Следует учитывать, что обработчик ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта, в частности, он не вызывается в случаях если запись были инициирована программно.
Методическая рекомендация (полезный совет)
1.4. В случае использования в конфигурации подсистемы «Обмен данными» Библиотеки стандартных подсистем обработчик ОбработкаПроверкиЗаполнения вызывается при проведении документов, после их загрузки из сообщения обмена. Для отключения некоторых проверок в этом режиме в обработчике можно анализировать дополнительное свойство объекта ДополнительныеСвойства . ОтложенноеПроведение .
Проверки, выполняемые в и вне транзакции записи объекта
2.1. Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта. Поскольку в случае некорректного заполнения объекта выполнение операции будет прервано еще до записи объекта в базу данных, то размещение проверок в этом обработчике является наиболее эффективным.
При выполнении внетранзакционных проверок в обработчике ОбработкаПроверкиЗаполнения необходимо учитывать тот факт, что новое состояние объекта еще не записано. Если требуется выполнить запрос к тем или иным данным системы, например, прочитать признак ВидНоменклатуры для товаров, выбранных в табличной части документа, «отталкиваясь» от данных документа, то такую поверку можно выполнить, применяя сохранение необходимых для запроса данных во временные таблицы.
2.2. В то же время, в обработчике ОбработкаПроверкиЗаполнения не следует размещать проверки, которые должны гарантировать целостное состояние объекта или зависящих от него данных (например, движений) на которые рассчитывает система. Поэтому для реквизитов, некорректные значения которых могут привести к рассогласованности данных в информационной базе, проверку корректности следует выполнять в обработчиках событий, возникающих в транзакции записи — ПередЗаписью , ПриЗаписи , ОбработкаПроведения (для документов).
Для транзакционных проверок, в свою очередь, выделяются два случая:
- Проверка состояния движений, формируемых документами оперативного учета. Такие проверки довольно часто встречаются в приложениях с оперативным учетом.
- Проверка состояния других объектов информационной базы, ссылки на которых содержатся в текущем объекте. Такие проверки следует применять очень редко. Не следует злоупотреблять количеством проверок в транзакции записи объекта. Следует помнить, что внутри транзакции записи имеет смысл выполнять только проверки таких ресурсов или таких правил соответствия объектов друг другу, которые не изменяются без проверок всеми участниками процесса.
В первом случае, проверку остатков некоторого ресурса имеет смысл выполнять в транзакции записи только в том случае, если все документы выполняют такую же проверку в транзакции записи. Если хоть один из документов, изменяющих ресурс, делает это без проверок, выполнение проверок другими участниками процесса бессмысленно и такие проверки необходимо выполнять вне транзакции. Исключением может быть только случай, когда документ, который выполняет изменение контролируемого ресурса без проверок, вводится крайне редко. Например, не смотря на то, что документ «Инвентаризация товаров» изменяет остатки товаров без проверок, эта ситуация допустима в виду того, что он вводится крайне редко. Каждое такое исключение из правила должно быть оправданным.
Во втором случае, если при записи Подразделения в транзакции записи выполняется проверка, что сотрудник, выбранный в качестве руководителя подразделения, имеет должность «Руководитель», то при записи Сотрудника также должна выполняться и «встречная» проверка этого же правила: нельзя записать Сотрудника с должностью отличной от «Руководитель», если он указан руководителем того или иного подразделения. Поскольку правило, что «Сотрудник», выбранный руководителем подразделения, должен иметь должность «Руководитель», может быть нарушено как при записи подразделения, так и при записи сотрудника, то и проверка должна выполняться или в транзакции записи обоих объектов, или вне транзакции записи обоих объектов (а может и не выполняться вообще).
Наиболее частые ошибки в 1С 8.3


Помощь персонального менеджера, оперативность сдачи отчетности, соответствие законодательству РФ
При работе с программами 1С Предприятие 8.3 пользователь может столкнуться с различного рода ошибками. Типичные ошибки 1С возникают вследствие программного сбоя, из-за некорректного выхода из программы или человеческого фактора. При этом причиной может стать сбой работы сети, отключение электроэнергии, сбой при динамическом обновлении и т.п.
В результате сбоя может быть нарушена логическая или физическая целостность программы. В зависимости от этого, программа может или совсем не открываться, или открываться в режиме «Конфигуратор», но не запускаться в пользовательском режиме, или работать, но при работе с определенными объектами выдавать сообщение об ошибке.
Если вашу программу сопровождает компания-франчайзи 1С, то без проблем можно обратиться за консультацией 1С. Также можно попытаться разобраться самому, и первое, что при возникновении нештатной ситуации нужно сделать пользователю, — проанализировать ошибку. Зачастую непосредственно в сообщении описывается ее суть, что может подсказать, как ее устранить. Необходимо проверить при работе в сети, запускается ли программа или появляется ли ошибка на другом компьютере. Если ошибка возникает при запуске программы – причину необходимо искать в кэше, если сбой происходит при попытке сформировать отчет или провести документ непосредственно в самой программе, то ошибка кроется непосредственно в информационной базе.
Рассмотрим, наиболее частые ошибки при работе 1С.
Ошибка Формата потока
Иногда при запуске программы пользователь может столкнуться с сообщением программы «Ошибка формата потока».
Устранение ошибки. В папке с установленной программой, кроме файла с информационной базой, имеются служебные временные файлы. При аварийном выключении программы также могут сохраниться файлы блокировок (которые автоматически должны были удалиться при выключении программы). Один из вариантов решения проблемы – это удаление из этой папки всех этих файлов. Такие файлы будут сформированы вновь при запуске программы, поэтому их можно смело удалить. Файл 1Cv8.1CD – файл информационной базы. Его удалять нельзя.
Кроме этого, следующим шагом (если первый вариант не дал результата) должно стать удаление информационной базы из списка в окне запуска 1С (кнопка «Удалить») и добавление ее обратно (кнопка «Добавить»). Тем самым мы очистим кэш.
Но такой вариант очистки кэша программы не очень верный, так как файлы при добавлении базы создаются новые, а старые так и остаются на диске. Поэтому при очистке кэша лучше их просто удалять самим вручную.
Посмотреть, где располагаются временные файлы программы, можно в кнопке «Настройка. » в окне запуска 1С. В поле «Каталоги шаблонов и конфигурация» видно, в какой папке располагаются временные файлы. В нашем примере в папке пользователя, далее в папке AppDataRoaming1Ctmplts.
Чтобы очистить кэш, необходимо удалить временные файлы из указанной папки.
Некоторые ошибки могут прямо указывать на папку с временными файлами, сообщая о проблеме. Например, ошибка «Неверный формат хранилища». Здесь видно, что программа указывает путь к папке с временными файлами. И чтобы очистить кэш вручную, надо удалить папки из указанной директории.
Неверный формат хранилища
На рисунке видно, что ошибка указывает на папку с временными файлами – AppData/Local/1C и далее папка с цифрами в названии.
То есть о решении проблемы уже сказано в самом сообщении. Для устранения ошибки необходимо очистить кэш, находящийся в указанной папке. В данном примере временные файлы находятся в папке Local, и очистка кэша должна решить проблему.
Ошибка СУБД. Внутренняя ошибка компоненты dbeng
Ошибка СУБД сама говорит о нарушении структуры базы данных. Довольно распространенная ошибка этого рода – «Внутренняя ошибка компоненты dbeng8».
Компонента dbeng8.dll находится в папке bin установленной платформы 1С.
Поэтому первый вариант решения проблемы – переустановка платформы 1С. При этом если компьютеры составляют сеть, на всех компьютерах должна быть установлена одна версия платформы 1С, а если нет возможности обновлять платформу, то можно просто скопировать этот файл из другой папки установки.
Если переустановка платформы не помогла, то переходим к варианту тестирования и исправления базы данных. Другие ошибки касающиеся СУБД также решаются этим способом.
«Ошибка СУБД: Файл базы данных поврежден»
Например, «Ошибка СУБД: Файл базы данных поврежден» решается тестированием и исправлением файла информационной базы.
Тестирование и исправление информационной базы с помощью утилиты chdbfl.exe
Одним из вариантов тестирования и исправления при возникновении ошибок, связанных с СУБД, является использование утилиты chdbfl.exe. Она предназначена для проверки физической целостности базы данных при работе с файловой информационной базой. Этот способ используется также, когда база 1С не запускается в режиме Конфигуратора.
Хотелось бы напомнить, что перед любыми действиями с информационной базой необходимо выполнить резервное копирование – в режиме Конфигуратора через пункт меню «Администрирование»-«Выгрузить информационную базу». Или можно скопировать файл информационной базы – 1Сv8.CD, из каталога, где она размещается.
Файл утилиты chdbfl.exe находится в папке bin, установленной платформы 1С – обычно в папке Program Files (х86)-1cv8, а далее папка с релизом платформы.
Запустив утилиту, в поле «Имя файла БД» указываем путь к файлу базы данных. Здесь надо установить галочку «Исправлять обнаруженные ошибки» и нажать кнопку «Выполнить». В результате утилита проверит физическую целостность базы данных и в случае обнаружения ошибок исправит их.
Если данный способ тестирования не решил проблему, то необходимо провести тестирование информационной базы в режиме «Конфигуратор».
Тестирование информационной базы в Конфигураторе
Для тестирования и исправления информационной базы запустим программу в режиме «Конфигуратор». В пункте меню «Администрирование» выберем «Тестирование и исправление. ».
В открывшемся окне тестирования базы устанавливаем необходимые для тестирования галочки.
«Реиндексация таблиц информационной базы» – исправляет ошибки, связанные со сбоем индексов. В программе ошибки могут проявляться наличием незаполненных полей, например, в документе отсутствует наименование или количество и т.п. При тестировании и исправлении рекомендуется выбирать этот пункт, так как он помогает решить большинство проблем, реиндексируя все таблицы.
«Проверка логической целостности информационной базы» – помогает исправить ошибки 1С, связанные с нарушением логической целостности. При ошибках такого рода программа может работать, но при обращении к объекту, в котором произошло нарушение (например, документу), программа будет выдавать ошибку. Установив данную галочку, программа проверит логическую целостность в структуре таблиц информационной базы.
«Проверка ссылочной целостности» – решает проблемы, связанные с возникновением ссылок на несуществующие объекты, которые появляются в результате сбоя или непосредственного удаления объекта. При обнаружении таких объектов необходимо выбрать вариант действия – создать, удалить объект, изменять его.
«Пересчет итогов». При сбое в программе в отчетах могут отображаться неверные данные, при расшифровке которых не видно их детализации, т.е. «цифра» есть, а данных о ней нет. В результате установки этой галочки будут пересчитаны все итоги в информационной базе, и данные восстановятся согласно существующим документам заново.
«Сжатие таблиц информационной базы». При установлении данной галочки происходит физическое удаление записей в таблицах, которые ранее были помечены на удаление в программе. Ведь при удалении объектов в базе, в таблицах они все равно сохраняются, накапливаясь и создавая объем. В результате этой операции таблицы информационной базы становятся меньше.
«Реструктуризация таблиц информационной базы» – данное действие создает новые таблицы, перенося в них данные из старых таблиц. То же самое происходит при выполнении обновления программы. Установление этой галочки исправляет некоторые ошибки.
После установки необходимых галочек нажимаем кнопку «Выполнить» и ждем окончания тестирования. По окончании тестирования программа выведет информацию о результатах тестирования.
При решении некоторых проблем помогает выгрузка и загрузка информационной базы в файл *dt (пункт меню «Администрирование» — «Выгрузка информационной базы. », затем «Загрузка информационной базы. »).
Данные ошибки возможны в файловых информационных базах. В любом случае, возникающие ошибки в программе необходимо анализировать. Но при их появлении, первые действия, которые можно предпринять, это:
- Очистить кэш;
- Провести тестирование и исправление с помощью утилиты chdbfl.exe;
- Тестирование и исправление базы в режиме «Конфигуратор»;
- Обновить платформу «1С:Предприятие».
При этом, конечно же, версия программы должна быть актуальной. Некоторые ошибки устраняются после установки обновления программы. Если проблемы с возникновением ошибок не удалось решить, обратитесь к нашим специалистам: мы проконсультируем и подберем для вас оптимальный тариф сопровождения и стоимость доработки 1С, исходя из ваших конкретных задач и потребностей.
Обработчик события ОбработкаПроверкиЗаполнения
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1.1. В данном обработчике модуля объекта выполняются действия, связанные с проверкой правильности заполнения значений реквизитов объектов (измерений, ресурсов, реквизитов табличных частей и т.п., далее: просто «реквизиты»).
1.2. Данным обработчиком следует пользоваться в случаях, когда для проверки корректности значений реквизитов обычной проверки на заполненность уже недостаточно (например, значение реквизита логически связано со значением другого реквизита), или же требование к тому, чтобы значение реквизита было заполнено не является безусловным.
Если проверка заполнения какого-либо реквизита — условная (т.е. зависит от значений других реквизитов или значения параметризированной функциональной опции) в обработчике следует предусмотреть код, который удаляет имя такого реквизита из массива проверяемых реквизитов ПроверяемыеРеквизиты . В общем виде, схема проверки заполнения выглядит следующим образом:
- создать массив НепроверяемыеРеквизиты ;
- в процессе проверки условий, добавлять в этот массив имена непроверяемых реквизитов (табличных частей);
- вызвать процедуру для удаления непроверяемых реквизитов (текст процедуры УдалитьНепроверяемыеРеквизитыИзМассива приведен ниже).
При этом не рекомендуется использовать другие схемы проверки заполнения значений реквизитов, так как они затрудняют анализ логики работы конфигурации, поскольку скрывают из свойства «Проверка заполнения» случаи условной проверки заполнения значений объектов.
Например, неправильно:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
// Значение реквизита не должно быть пустым в зависимости от значения другого реквизита
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
// Для индивидуального предпринимателя должно быть сопоставлено физ. лицо
ПроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
НепроверяемыеРеквизиты = Новый Массив();
.
// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.’»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
НепроверяемыеРеквизиты.Добавить(«ИНН»);
КонецЕсли;
.
// Значение реквизита не должно быть пустым в зависимости от другого реквизита
Если ЮрФизЛицо <> Перечисления.ЮрФизЛицо.ФизЛицо Тогда
НепроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
// перед удалением реквизита из массива необходимо проверить, что он там есть
// (не был удален ранее платформой или в коде).
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
1.3. Следует учитывать, что обработчик ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта, в частности, он не вызывается в случаях если запись были инициирована программно.
Методическая рекомендация (полезный совет)
1.4. В случае использования в конфигурации подсистемы «Обмен данными» Библиотеки стандартных подсистем обработчик ОбработкаПроверкиЗаполнения вызывается при проведении документов, после их загрузки из сообщения обмена. Для отключения некоторых проверок в этом режиме в обработчике можно анализировать дополнительное свойство объекта ДополнительныеСвойства . ОтложенноеПроведение .
Проверки, выполняемые в и вне транзакции записи объекта
2.1. Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта. Поскольку в случае некорректного заполнения объекта выполнение операции будет прервано еще до записи объекта в базу данных, то размещение проверок в этом обработчике является наиболее эффективным.
При выполнении внетранзакционных проверок в обработчике ОбработкаПроверкиЗаполнения необходимо учитывать тот факт, что новое состояние объекта еще не записано. Если требуется выполнить запрос к тем или иным данным системы, например, прочитать признак ВидНоменклатуры для товаров, выбранных в табличной части документа, «отталкиваясь» от данных документа, то такую поверку можно выполнить, применяя сохранение необходимых для запроса данных во временные таблицы.
2.2. В то же время, в обработчике ОбработкаПроверкиЗаполнения не следует размещать проверки, которые должны гарантировать целостное состояние объекта или зависящих от него данных (например, движений) на которые рассчитывает система. Поэтому для реквизитов, некорректные значения которых могут привести к рассогласованности данных в информационной базе, проверку корректности следует выполнять в обработчиках событий, возникающих в транзакции записи — ПередЗаписью , ПриЗаписи , ОбработкаПроведения (для документов).
Для транзакционных проверок, в свою очередь, выделяются два случая:
- Проверка состояния движений, формируемых документами оперативного учета. Такие проверки довольно часто встречаются в приложениях с оперативным учетом.
- Проверка состояния других объектов информационной базы, ссылки на которых содержатся в текущем объекте. Такие проверки следует применять очень редко. Не следует злоупотреблять количеством проверок в транзакции записи объекта. Следует помнить, что внутри транзакции записи имеет смысл выполнять только проверки таких ресурсов или таких правил соответствия объектов друг другу, которые не изменяются без проверок всеми участниками процесса.
В первом случае, проверку остатков некоторого ресурса имеет смысл выполнять в транзакции записи только в том случае, если все документы выполняют такую же проверку в транзакции записи. Если хоть один из документов, изменяющих ресурс, делает это без проверок, выполнение проверок другими участниками процесса бессмысленно и такие проверки необходимо выполнять вне транзакции. Исключением может быть только случай, когда документ, который выполняет изменение контролируемого ресурса без проверок, вводится крайне редко. Например, не смотря на то, что документ «Инвентаризация товаров» изменяет остатки товаров без проверок, эта ситуация допустима в виду того, что он вводится крайне редко. Каждое такое исключение из правила должно быть оправданным.
Во втором случае, если при записи Подразделения в транзакции записи выполняется проверка, что сотрудник, выбранный в качестве руководителя подразделения, имеет должность «Руководитель», то при записи Сотрудника также должна выполняться и «встречная» проверка этого же правила: нельзя записать Сотрудника с должностью отличной от «Руководитель», если он указан руководителем того или иного подразделения. Поскольку правило, что «Сотрудник», выбранный руководителем подразделения, должен иметь должность «Руководитель», может быть нарушено как при записи подразделения, так и при записи сотрудника, то и проверка должна выполняться или в транзакции записи обоих объектов, или вне транзакции записи обоих объектов (а может и не выполняться вообще).
Оценка статьи:




Загрузка…
Adblock
detector