24.07.11 — 13:27
Привет. У меня такой вопрос…
1 — 24.07.11 — 13:35
//ОбщиеМодули
Функция ВводФИОПользователя(ФИО) Экспорт
Результат = Ложь;
ФИО = «»;
Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда
Если Не ПустаяСтрока(ФИО) Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
//ФормаДокументаМастер
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
//Вставить содержимое обработчика
ТекФИО = «»;
Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда
ФИОПользователя = ТекФИО;
Сообщить(«»+ФИОПользователя);
КонецЕсли;
КонецПроцедуры
В этом случае у меня открывается нужный мне интерактивный ввод строки, но реквизиту документа ФИОПользователя значение ТекФИО не присваивается. Подскажите — почему?
2 — 24.07.11 — 13:35
какой
3 — 24.07.11 — 13:40
А ты ТекФИО проверь?
мне кажется на сервер она уйдет по значению, а не по ссылке, хотя возможно я неправ
4 — 24.07.11 — 13:45
попробуй при присваивание обратится напрямую к реквизиту документа — Объект.ФИОПользователя
5 — 24.07.11 — 13:47
Расширение формы документа.ПослеЗаписи (Document form extension.AfterWrite)
Расширение формы документа (Document form extension)
ПослеЗаписи (AfterWrite)
Синтаксис:
ПослеЗаписи()
Описание:
Возникает после записи объекта, и после окончания транзакции записи, то есть к моменту вызова этой процедуры запись объекта полностью завершена.
6 — 24.07.11 — 13:48
(5) вопрос не в логических ошибках
7 — 24.07.11 — 13:50
ну ну . Читаем внимательно:
«v8: Не записывается значение, передаваемое реквизиту документа 1С 8.2.» — хочет изменить реквизит документа после записи.
8 — 24.07.11 — 13:51
Поставь на строчку
Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда
отладчик
9 — 24.07.11 — 13:53
забыл сказать сразу, что пробовал сделать и процедуре ПередЗаписью() — то же самое.
10 — 24.07.11 — 13:54
(9) синхронизируй данные формы клиента с данными памяти сервера, сравни версии объектов
11 — 24.07.11 — 13:55
Объект.ФИОПользователя = ?
12 — 24.07.11 — 13:57
1CProfessional, твой ник отражает получение сертификата, или то, что ты обречен на успех?
13 — 24.07.11 — 13:57
(11) не проверил еще… сейчас…
14 — 24.07.11 — 13:58
(12) мой ник отображает мое стремление стать им! ))
15 — 24.07.11 — 14:02
(7) я так понял, что Сообщить(«»+ФИОПользователя); выдает пустую строчку
16 — 24.07.11 — 14:03
(15) нет! кк раз выжает введенной пользователей ФИО — строку.
17 — 24.07.11 — 14:05
делаю сейчас все это в ПередЗаписью() — нет желаемого результата…
18 — 24.07.11 — 14:06
не подскажете, а есть что-нибудь из инструментария к 8.2 типа «NHANDS.ERT» для 7.7???
19 — 24.07.11 — 14:09
а как шагать в отладчике 8.2?
20 — 24.07.11 — 14:10
Срочно во франч, там научат шагать.
21 — 24.07.11 — 14:11
франч от меня в 70-ти км!
22 — 24.07.11 — 14:12
ближайший
23 — 24.07.11 — 14:12
Тогда .
Помогу удаленно 800 руб час.
24 — 24.07.11 — 14:13
это ты загнул, бадди
25 — 24.07.11 — 14:13
)))
26 — 24.07.11 — 14:15
(25) научу шагать за 400 руб
27 — 24.07.11 — 14:16
))))
28 — 24.07.11 — 14:16
если написать Объект.ФИОПользователя = ТекФИО получаю ошибку при проверке на сервере…
29 — 24.07.11 — 14:34
не подскажете, а есть что-нибудь из инструментария к 8.2 типа «NHANDS.ERT» для 7.7?
30 — 24.07.11 — 15:52
ПередЗаписью()
31 — 24.07.11 — 16:07
(30) no result!!!
32 — 24.07.11 — 16:26
(28)Текст ошибки в студию…И встань отладчиком на строку перед ошибкой.
33 — 24.07.11 — 17:47
ФИОПользователя = ТекФИО;
Сообщить(«»+ФИОПользователя);
мне сообщается введенная мной строка! не пойму — почему документ не хватает в реквизит ФИОПользователя это значение?!
еще раз — делаю это уже в процедуре ПередЗаписью().
34 — 24.07.11 — 17:51
как я проверяю и вижу, что реквизиты по документам остаются незаполненными? да вот как:
внешняя обработка с кодом:
//***********************************************************
Процедура РеестрДоков()
Выборка = Документы.ЧекККМ.Выбрать(НачДата,КонДата);
Пока Выборка.Следующий() Цикл
Если ПустаяСтрока(Выборка.ФИОПользователя) Тогда
Сообщить(«»+Выборка+» — нет данных»);
Иначе
Сообщить(«»+Выборка+» — «+Выборка.ФИОПользователя);
КонецЕсли;
КонецЦикла
КонецПроцедуры
&НаКлиенте
Процедура РеестрДоков1(Команда)
// Вставить содержимое обработчика.
РеестрДоков();
КонецПроцедуры
//НачДата = ТекущаяДата();
//КонДата = ТекущаяДата();
35 — 24.07.11 — 20:04
Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда
убери
36 — 24.07.11 — 20:27
(35) не понял! мне это как раз нужно.
37 — 25.07.11 — 07:21
ну что — есть мысли?
38 — 25.07.11 — 07:29
Чтобы шагать в отладчике, надо запустить 1С в режиме отладки. Встаешь на нужную строчку кода в конфигураторе и нажимаешь F5. В меню Отладчик… можно посмотреть различные режимы шагания. Под каждый режим есть своя кнопка на клавиатуре или пиктограмма. Устанавливаешь маркер остановки и начинаешь в 1С Предприятие работать. Когда остановиться программа в указанном месте, то можно посмотреть значения переменных и результат работы используемых в коде методов. А дальше… дальше надо думать почему там не те значения, которые ожидаешь и ставить маркер немного раньше или в самом начале процедуры, чтобы отследить проблемное место
39 — 26.07.11 — 22:50
(38) Спасибо!!!
40 — 31.07.11 — 01:17
Нет, вопрос мой не закрыт))
41 — 31.07.11 — 01:20
У кого-то походу дублирующиеся имена реквизитов объектов и форм. Может еще и переменные объявлены.
42 — 31.07.11 — 01:21
да нет… не в этом дело
43 — 31.07.11 — 01:33
добавил в документ новый реквизит… как теперь его проставить в выборке? перезаписать все доки (около 40 шт.) с заданным этому реквизиту значением (одинаковым пока)?
44 — 31.07.11 — 01:38
сделать простановку этого реквизита внешней обработкой.
45 — 31.07.11 — 03:03
В модуле формы в процедуре «ПередЗаписью» есть параметр, если не ошибаюсь, «ТекущийОбъект», именно в его свойства надо писать то что должно в итоге записаться в базу, так как просто «объект» это данные формы, которые обновятся после отработки транзакции записи. Документацию надо читать, перед тем как что то ваять. И уж совсем дико видеть изменение объекта в событии «ПослеЗаписи»
(43) А какие варианты?
46 — 08.08.11 — 09:55
(45) Добавил в документ ЧекККМ свой реквизит (Строка). Нужно реализовать его заполнение произвольными строковыми значениями при вводе новых доков в информационную базу данных. Все, потом будет работать мини-реестр документов — так же — мной сделанный — на выборку документов с фильтром по этому реквизиту.
47 — 08.08.11 — 10:09
Мне кажется, что ТС игнорирует (4) и (11). Взлетело же бы ведь!
48 — 08.08.11 — 10:14
А, не, не игнорирует.
Интересно, а «ЭтаФорма.ФИОПользователя = ТекФИО;» поможет?
49 — 08.08.11 — 12:45
щас попробую ЭтаФорма
50 — 08.08.11 — 15:25
если пишу ЭтаФорма… — ругается на неизвестность переменной ФИОПользователя
51 — 08.08.11 — 15:25
равно, как и в случае написания Объект.ФИОПользователя
52 — 08.08.11 — 15:57
Так. Давай по порядку.
Судя по коду из (1)
ТекФИО = «»;
Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда //тут вообще-то ТекФИО не возвращается, а проверяется только на возврат булева.
ФИОПользователя = ТекФИО;
Сообщить(«»+ФИОПользователя);
// Однако в (33) ты пишешь, что отражается, что нужно. Откуда берётся? Код весь давай!
КонецЕсли;
Если директива выполнения перед процедурой/функцией не указана, она будет выполняться на сервере. Для наглядности директиву лучше указывать сразу.
53 — 08.08.11 — 16:03
ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО)
В ВводФИОПользователя(ТекФИО)
такой код (эту функцию добавил в конфу сам):
Функция ВводФИОПользователя(ФИО) Экспорт
Результат = Ложь;
ФИО = «»;
Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда
Если Не ПустаяСтрока(ФИО) Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
54 — 08.08.11 — 16:05
// Однако в (33) ты пишешь, что отражается, что нужно. Откуда берётся?
именно! сообщается введенное via ВвестиСтроку() строковое значение!!! но к доку оно «не лепится»!
55 — 08.08.11 — 16:08
Молодец, что добавил.
Функция твоя откроет окошко ввода строки… даст пользователю ввести «Давлаташуевич Саша Сашадшуевич»… и коварно возвратит не введённую строку ФИО, а [ДА] Слышишь, ТС? Функция твою возвратит значение хИСТИНА]: да, хозяина-ма, юзера писал-писал, я видела, да. А? Чо писал? Не, не знаю.
56 — 08.08.11 — 16:13
Зачем ты вообще эту обработку используешь?
Хочешь какому-то документу присвоить реквизит, который не отражается на форме?
Пойди _самым_ простым путём: не дописывай существующее, а напиши маленькую, удобную, _свою_ обработочку: на форме два поля. Одно — выбор нужного документа ЧекККМ, второе — то, что нужно присвоить реквизиту документа. Всё. И с УФ по-человечески разберешься и с директивами разберешься.
Да и обработку сможешь выложить и показать, еси чо.
57 — 08.08.11 — 17:12
Погоди… Я все тобой написанное, конечно, прочел! И за это — спасибо, тебе!
НО!
Рассказываю для чего это все мне.
Есть магазин с одним ноутом. На нем запущена конфа УТ 11.0 (11.0.6.9). В конфи «сидит» один пользователь — Продавец1. При этом продавцов-консультантов — 3 человека. Вот и появилась нужда в «фамилизации» вводимых в БД доков. Я, вообще, в основном с 7.7 (до сих пор) связан на своей основной работе… Неужели не получится реализовать задуманный мною план?
58 — 09.08.11 — 09:11
А. Ну… ты глобально конечно к задаче-то подошел. С места в карьер
Дык это… разве в УТ в документах нет признака «Ответственный» или что-то типа того. Заведи пользователей, но в настройках поставь, чтобы не отражались в списке выбора.
Или пусть пишут своё ФИО в поле «Комментарий».
Можно так? Неужели решить вопрос без допиливания не получится?
1CProfessional
59 — 09.08.11 — 20:01
(58) Я хочу сделать именно так, как выше сказал… Есть на то причины…
s41_blizzard 0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
||||
1 |
||||
Реквизит не записывается при проведении документа26.08.2015, 17:58. Показов 19525. Ответов 20 Метки нет (Все метки)
Подскажите, как сделать, чтобы код ниже отрабатывал при проведении документа?
0 |
Злой самаритянин 182 / 182 / 94 Регистрация: 24.04.2014 Сообщений: 686 |
|
26.08.2015, 18:12 |
2 |
1. Процедура выбрана, где надо? (см. скрин), вообще для проведения используется процедура ОбработкаПроведения. 2. Внимательно читаем СП: Кликните здесь для просмотра всего текста
ЭтотОбъект (ThisObject) Описание: В модуле объекта обращайся к реквизитам не через ЭтотОбъект, а напрямую. Еще конструктор движений есть. 2 клик по документу — движения, там кнопка. Посмотри, как он строит процедуру, делай так же. Миниатюры
0 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
26.08.2015, 18:13 |
3 |
s41_blizzard, на форме можно ПриЗаписи, ПередЗаписьюНаСервере и и т.д.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
26.08.2015, 18:30 [ТС] |
4 |
Процедура помещена в модуле документа Добавлено через 2 минуты
0 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
26.08.2015, 18:37 |
5 |
s41_blizzard, хм, каша прям из всего.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
26.08.2015, 18:41 [ТС] |
6 |
Изначально, я пытался все делать проще: просто в форме списка добавить реквизит «сумма документа». Без всяких доп.примочек. Но в списке почему-то этот реквизит оставался пустым. Пришлось все это писать
0 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
26.08.2015, 18:48 |
7 |
s41_blizzard, конфигурация своя или типовая?
1 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
26.08.2015, 18:49 [ТС] |
8 |
Своя, к сожалению
0 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
26.08.2015, 19:08 |
9 |
s41_blizzard, понятно. Как реализовать я вкратце написал, дальше поставить задачу чёткую, что в итоге надо и только тогда решите её сами.
0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
26.08.2015, 19:17 |
10 |
s41_blizzard, Обработка события «При записи» выполняется уже после того как объект записан в базу. Поэтому любые модификации объекта уже не к чему не приводят. В Вашем случае нужно использовать событие «Перед записью». Только в этом случае обращаться к данным с помощью запроса не получится. Придется все посчитать программно.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
27.08.2015, 15:35 [ТС] |
11 |
Созрел теперь такой вопрос:
0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
27.08.2015, 15:42 |
12 |
Может элемент формы не связан с данными документа? Приложи конфигурацию.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
27.08.2015, 15:50 [ТС] |
13 |
Вот она. Проблема в формах списка обоих документов. Реквизиты появляются, но нужно сначала нажать кнопку «записать», если просто «провести», а потом закрыть, ничего не изменится.
0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
27.08.2015, 16:09 |
14 |
Проблема не в списке документов, а в оброботчике события «Перед записью».
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
27.08.2015, 16:17 [ТС] |
15 |
Я это понял.
0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
27.08.2015, 16:33 |
16 |
Без всяких дополнительных примочек, разве не должен отображаться реквизит документа в форме списка, если он нормально вполне отображается в форме самого документа? Должен.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
27.08.2015, 16:36 [ТС] |
17 |
Ну тогда тайна сия великая есть.
0 |
Tklwegsd 841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
||||
27.08.2015, 16:40 |
18 |
|||
Сделай так:
И убедись, что все работает и отображается сразу. В конфе проблема в запросе.
0 |
0 / 0 / 0 Регистрация: 25.07.2015 Сообщений: 32 |
|
28.08.2015, 16:10 [ТС] |
19 |
Запрос вроде бы тоже правильно написал, я проверял через консоль его. Выше сказали, что в процедуре «перед записью» не можно использовать запросы. А как тогда быть?
0 |
Tklwegsd 841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
||||
28.08.2015, 19:21 |
20 |
|||
Решение
Запрос вроде бы тоже правильно написал, я проверял через консоль его. Запрос не работает так как надо, потому что он считывает данные из базы, а так как документ еще не записан, то считываются данные предыдущей версии.
Выше сказали, что в процедуре «перед записью» не можно использовать запросы. Ну там я малость погорячился, запросы конечно же можно использовать. Только в Вашем случае это не спасает по причине, описанной выше.
А как тогда быть? Как вариант, вычислите значения необходимых реквизитов по текущему состоянию объекта.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
28.08.2015, 19:21 |
20 |
Запись значения в Реквизит
Автор Malum, 11 сен 2018, 19:27
0 Пользователей и 1 гость просматривают эту тему.
Нужно записать прочитанное из файла значение в реквизит документа.
Делаю так, но не срабатывает.
&НаСервере
Процедура Команда3НаСервере()
Файл = Новый ЧтениеТекста(Объект.Реквизит2);
Стр = Файл.ПрочитатьСтроку();
НовДок = Документы[Стр].СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
Стр = Файл.ПрочитатьСтроку();
Пока (Стр<>»НачТабЧасти») Цикл
ИмяРек = Файл.ПрочитатьСтроку();
НовДок[Стр]=ИмяРек;
Стр = Файл.ПрочитатьСтроку();
КонецЦикла;
НовДок.Записать();
КонецПроцедуры
Спасибо за Сказать спасибо
Цитата: Malum от 12 сен 2018, 13:00имярек это значение реквизита
это не значение реквизита, а некое строковое представление реквизита в файле.
Его необходимо привести к типу реквизита, а только потом присваивать.
Если это справочник, то нужно найти соответствующий элемент, если документ, то соответствующий документ и так далее.
Спасибо за Сказать спасибо
Либо НовДок[Стр] не является реквизитом документа, либо этот реквизит не имеет тип Строка
Цитата: alex0402 от 12 сен 2018, 13:19
Цитата: Malum от 12 сен 2018, 13:00имярек это значение реквизита
это не значение реквизита, а некое строковое представление реквизита в файле.
Его необходимо привести к типу реквизита, а только потом присваивать.
Если это справочник, то нужно найти соответствующий элемент, если документ, то соответствующий документ и так далее.
НовЭлем = Справочники.Номенклатура.НайтиПоНаименованию(ИмяРек);
НовДок[Стр]=НовЭлем;
Пишет, Поле объекта не обнаружено (Номенклатура)
Цитата: Malum от 12 сен 2018, 13:38Пишет, Поле объекта не обнаружено (Номенклатура)
В какой строке?
справочник Номенклатура в базе имеется и он именно так называется? до буковки?
Спасибо за Сказать спасибо
-
Только начинаю программировать в 8, подскажите что не так делаю: В УТ 10.3 в документе ПеремещениеТоваров нет реквизита «Сумма»(тоже непонятно почему). Сделала реквизит «СуммаДок», в модуль проведения в процедуру ОбработкаПроведения дописала
СуммаДок = 0; Для Каждого ТекСтрокаТовары Из Товары Цикл СуммаДок = СуммаДок +ТекСтрокаТовары.Цена*ТекСтрокаТовары.Количество;
Теперь, если открыть документ, нажать на ОК, то сумма появиться, если провести через меню Действия
Провести, то сумма не заполняется, хотя в отладчике все суммируется. Не пойму что не так делаю. -
Offline
AlexFF
Разбирающийся- Регистрация:
- 6 мар 2007
- Сообщения:
- 565
- Симпатии:
- 1
- Баллы:
- 26
Так поделитесь опытом с другими
-
При нажатии на кнопку ОК в документе, происходит сначала запись документа и всех реквизитов, а потом проведение, а если провести документ из журнала через меню Действие, то процедура записи не вызывается, документ только проводится, поэтому хоть реквизит и расчитывается правильно, но он не записывается, думаю, что так.
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Присваивать значение реквизиту в обработке проведения — моветон.
Используйте ПередЗаписью. -
Offline
sirantd
- Регистрация:
- 16 окт 2009
- Сообщения:
- 2
- Симпатии:
- 0
- Баллы:
- 1
Извиняюсь за поднятие старой темы, но вот такой самый вопрос у меня, а решения тут не увидел. У меня событие ПередЗаписью не вызывается при нажатии на строке в журнале менюшки «Провести». А мне надо запустить перепроведение всех документов определенного типа с изменением некоторых значений в табличных частях.
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Где именно не вызывается? В модуле формы? Там и не должно в этом случае.
-
Offline
sirantd
- Регистрация:
- 16 окт 2009
- Сообщения:
- 2
- Симпатии:
- 0
- Баллы:
- 1
Все, теперь и я понял свою ошибку. Все работает, спасибо огромное
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
ОФФ: Есть спец кнопка для этого
-
Offline
nbIpKuH_BaH9I
Модераторы
Команда форума
Модератор- Регистрация:
- 16 сен 2009
- Сообщения:
- 7.973
- Симпатии:
- 523
- Баллы:
- 204
Пожалуй подниму. У меня есть подписка на событие проведения документа. Где выполняется создание одного справочника. Ссылку на этот справочник я могу получить только после проведения, а мне надо ее записать в реквизит этого же документа. Как такое сделать?
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.592
- Симпатии:
- 999
- Баллы:
- 204
Каким образом ссылка на элемент справочника попадает в реквизит проведенного документа?
Почему нельзя получить ссылку на элемент справочника внутри ПередЗаписью документа? -
Offline
nbIpKuH_BaH9I
Модераторы
Команда форума
Модератор- Регистрация:
- 16 сен 2009
- Сообщения:
- 7.973
- Симпатии:
- 523
- Баллы:
- 204
Процедура очень сложная. И выполняется при проведении документов, многих. Именно в момент проведения в зависимости от движений документа формируется элемент справочника. Ну вот схема такая. Я вызываю запись объекта при проведении, но это просто жесть. Походу придется переписывать((((
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.592
- Симпатии:
- 999
- Баллы:
- 204
Делать синхронно высоконагруженные операции и при этом еще генерировать транзакции записи в бд — изначально неправильное решение. Как минимум сделать асинхронный механизм.
Поле объекта недоступно для записи в 1С
После обновления или доработки конфигурации пользователи иногда сталкиваются с ошибкой в 1С 8.3 «Поле объекта недоступно для записи». Разберем, с чем связана ошибка и как ее исправить на примерах в платформе 8.3.15.1747. Для самостоятельного решения задачи пользователю потребуются начальные знания в области 1С программирования.
Причины появления ошибки
При появлении ошибки после обновления конфигурации достаточно дождаться выхода исправленной версии. Разработчики 1С оперативно реагируют на возникшие проблемы и решают вопрос в короткие сроки. Но лучше подстраховаться заранее и либо предварительно устанавливать обновления на тестовую базу, либо иметь в запасе актуальную резервную копию.
Если конфигурация изменялась, редактировалась под нужды организации, то для устранения ошибки лучше обратиться к программисту 1С.
Сообщение «Поле объекта недоступно для записи (Имя_поля)» выдается пользователю, когда программа в процессе исполнения кода не может присвоить элементу требуемое значение.
Доступно только для чтения данных
При работе с объектами 1С различают два способа обращения к данным:
- ссылка — содержит только представление объекта, часто это код и наименование. Сам объект не загружается. Доступ к реквизитам получают разыменованием: обращением через точку. Ссылки читаются из базы, но не изменяются;
- объект — включает данные в полном объеме, в т. ч. реквизиты, табличные части, которые можно создавать, удалять и редактировать.
Ссылочные данные программисты используют, когда не потребуется изменять объект. Программа обрабатывает ссылки быстрее, т. к. из базы загружается только информация об объекте — ссылка, а не сам объект целиком со всеми реквизитами и другими входящими в него данными. Для записи изменений из ссылки получают объект: например, с помощью метода ПолучитьОбъект(). Если это не сделано, и присвоение нового значения производится ссылочному полю, возникает ошибка «Поле объекта недоступно для записи».
Для перехода к месту ошибки:
- запустите конфигурацию в режиме отладки через конфигуратор Отладка — Начать отладку;
- повторите действия, приводящие к ошибке;
- в окне предупреждения нажмите Подробно, затем Конфигуратор.
В открывшемся служебном окне в нижней части конфигуратора отразится информация о месте сбоя:
- Поле объекта недоступно для записи (ВалютаДенежныхСредств) — тест ошибки и имя элемента, куда программа пытается сохранить данные;
- Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(137) — путь до модуля, где расположена выполняемая строка кода, и порядковый номер строки с ошибкой;
- НайденныйБанковскийСчет.ВалютаДенежныхСредств = БанковскийСчет.ВалютаДенежныхСредств — команда записи изменений, в которой возникает сбой.
Чтобы исправить ошибку:
1. Поставьте точку останова на строке кода из служебного сообщения.
2. Перейдите в режим отладки конфигурации по кнопке Начать отладку.
3. Выполните действия, приводящие к появлению ошибки, и исполнение программы остановится на отмеченной строке кода;
4. С помощью команды контекстного меню Вычислить выражение определите тип объекта, которому присваивается значение:
- НайденныйБанковскийСчет — содержит ссылку на элемент справочника Банковские счета;
- ВалютаДенежныхСредств — реквизит справочника Банковские счета, имеет ссылочный тип данных на справочник Валюта.
При определении типа выделяйте объект постепенно: сначала узнайте тип первой часть объекта до точки, далее увеличивайте количество выделенных частей. Если реквизит имеет ссылочный тип данных, результат в окне Выражение может быть неверно понят пользователем. Почти всегда в операциях присваивания последним указывается реквизит объекта.
5. Для получения объекта впишите строку кода с использованием соответствующего метода:
- документы, справочники, планы счетов и др. — ПолучитьОбъект();
- константы, перечисления, регистры и др. — Получить(), Прочитать();
Подробное описание методов смотрите в Синтакс-Помощнике.
6. В выражении замените ссылку на объект.
Объекты конфигурации делятся:
- объекты (ДокументОбъект.[Имя] и др.) — можно найти в базе по ссылке. На вкладке Прочее в окне редактирования объекта конфигурации есть Модуль объекта;
- набор записей — для изменения одной записи регистров, перечислений используют менеджер записи, для констант — менеджер значения.
Ошибку «Поле объекта недоступно для записи» 1С выдает при неправильной записи как объектных данных, так и наборов записей. Обращение с записями лучше не исправлять самостоятельно, а поручить программисту.
Попытка изменить системные поля
В 1С существуют специальные системные поля, которым программа присваивает значения по умолчанию:
- порядковый номер строки;
- номер группировки;
- уровень группировки.
Системные поля доступны только для чтения. Создаются автоматически к элементам: например, номера строк табличных частей или уровень группировки в отчете. Повлиять на них пользователь не может. При попытке изменить значение будет выдано окно с предупреждением:
Один из вариантов решения:
1. Выключите отображение системного поля через свойство Видимость.
2. Добавьте свой реквизит в табличную часть кнопкой Добавить колонку реквизита.
3. Замените в строке кода, где возникает ошибка, системное поле на имя созданного реквизита.
Имя переменной совпадает с именем объекта
При использовании переменных в программном коде следует задавать им наименования, отличные от зарезервированных за объектами системы. В противном случае программа посчитает их не переменными, которым можно присваиваться любое значение, а элементами базы соответствующего типа с уже заданными значениями.
В примере в переменную Документы пытаются записать результат выборки документов. В процессе выполнения программы пользователю выдается сообщение «Поле объекта недоступно для записи (Документ)». Для решения проблемы измените имя переменной, но оно не должно начинаться с цифры и совпадать с другими переменными во избежание конфликтных ситуаций.
Кроме команды равенства логично предположить, что переменная используется в последующем коде, где после изменения имени начнут возникать различные сбои. Поэтому поменять наименование нужно во всем местах, в которых она упоминается.
Изменение элемента формы
Еще один пример кода, приводящий к ошибке «Поле объекта недоступно для записи», — неверное обращение к полям формы при попытке присвоить им новое значение.
Формы содержат коллекцию элементов формы, через разыменование (точку) получают доступ к полю, таблице и т. д. и управляют их свойствами. Элементы используются для графической визуализации информации на форме. Они не содержат данные, путь к ним прописан в свойстве Путь к данным.
Чтобы изменить значение элемента, используют:
- реквизиты объекта;
- реквизиты, созданные в форме;
- свойство ТекущиеДанные при обращении к данным текущей строки табличной части.
Ошибку «Поле объекта недоступно для записи» сможет исправить пользователь самостоятельно, если он хоть немного разбирается в программном коде. Все изменения рекомендуется сначала произвести в тестовой базе. При возникновении затруднений передайте программисту 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
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.
Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута:
* Географические координаты объектов, которые хранятся в базе;
* Координаты начальной и коне
Посмотреть все результаты поиска похожих