Не записывает в реквизит документа значение 1с

   1CProfessional

24.07.11 — 13:27

Привет. У меня такой вопрос…

  

Партнерская программа EFSOL Oblako

   1CProfessional

1 — 24.07.11 — 13:35

//ОбщиеМодули

Функция ВводФИОПользователя(ФИО) Экспорт

   
   Результат = Ложь;

   
   ФИО = «»;

   Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда

       Если Не ПустаяСтрока(ФИО) Тогда

           Результат = Истина;

       КонецЕсли;

   КонецЕсли;

   Возврат Результат;

   
КонецФункции

//ФормаДокументаМастер

&НаКлиенте

Процедура ПослеЗаписи(ПараметрыЗаписи)

   //Вставить содержимое обработчика

   
   ТекФИО = «»;

   Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда

       ФИОПользователя = ТекФИО;

       Сообщить(«»+ФИОПользователя);

   КонецЕсли;

КонецПроцедуры

В этом случае у меня открывается нужный мне интерактивный ввод строки, но реквизиту документа ФИОПользователя значение ТекФИО не присваивается. Подскажите — почему?

   izekia

2 — 24.07.11 — 13:35

какой

   izekia

3 — 24.07.11 — 13:40

А ты ТекФИО проверь?

мне кажется на сервер она уйдет по значению, а не по ссылке, хотя возможно я неправ

   kimi_mm

4 — 24.07.11 — 13:45

попробуй при присваивание обратится напрямую к реквизиту документа — Объект.ФИОПользователя

   Ник второй

5 — 24.07.11 — 13:47

Расширение формы документа.ПослеЗаписи (Document form extension.AfterWrite)

Расширение формы документа (Document form extension)

ПослеЗаписи (AfterWrite)

Синтаксис:

ПослеЗаписи()

Описание:

Возникает после записи объекта, и после окончания транзакции записи, то есть к моменту вызова этой процедуры запись объекта полностью завершена.

   izekia

6 — 24.07.11 — 13:48

(5) вопрос не в логических ошибках

   Ник второй

7 — 24.07.11 — 13:50

ну ну . Читаем внимательно:

«v8: Не записывается значение, передаваемое реквизиту документа 1С 8.2.» — хочет изменить реквизит документа после записи.

   МимохожийОднако

8 — 24.07.11 — 13:51

Поставь на строчку

Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда

отладчик

   1CProfessional

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, твой ник отражает получение сертификата, или то, что ты обречен на успех? :)

   1CProfessional

13 — 24.07.11 — 13:57

(11) не проверил еще… сейчас…

   1CProfessional

14 — 24.07.11 — 13:58

(12) мой ник отображает мое стремление стать им! ))

   izekia

15 — 24.07.11 — 14:02

(7) я так понял, что Сообщить(«»+ФИОПользователя); выдает пустую строчку

   1CProfessional

16 — 24.07.11 — 14:03

(15) нет! кк раз выжает введенной пользователей ФИО — строку.

   1CProfessional

17 — 24.07.11 — 14:05

делаю сейчас все это в ПередЗаписью() — нет желаемого результата…

   1CProfessional

18 — 24.07.11 — 14:06

не подскажете, а есть что-нибудь из инструментария к 8.2 типа «NHANDS.ERT» для 7.7???

   1CProfessional

19 — 24.07.11 — 14:09

а как шагать в отладчике 8.2?

   Ник второй

20 — 24.07.11 — 14:10

Срочно во франч, там научат шагать.

   1CProfessional

21 — 24.07.11 — 14:11

франч от меня в 70-ти км!

   1CProfessional

22 — 24.07.11 — 14:12

ближайший

   Ник второй

23 — 24.07.11 — 14:12

Тогда .

Помогу удаленно 800 руб час.

   1CProfessional

24 — 24.07.11 — 14:13

это ты загнул, бадди

   1CProfessional

25 — 24.07.11 — 14:13

)))

   temsa

26 — 24.07.11 — 14:15

(25) научу шагать за 400 руб :)

   1CProfessional

27 — 24.07.11 — 14:16

))))

   1CProfessional

28 — 24.07.11 — 14:16

если написать Объект.ФИОПользователя = ТекФИО получаю ошибку при проверке на сервере…

   1CProfessional

29 — 24.07.11 — 14:34

не подскажете, а есть что-нибудь из инструментария к 8.2 типа «NHANDS.ERT» для 7.7?

   Икогнито

30 — 24.07.11 — 15:52

ПередЗаписью()

   1CProfessional

31 — 24.07.11 — 16:07

(30) no result!!!

   МимохожийОднако

32 — 24.07.11 — 16:26

(28)Текст ошибки в студию…И встань отладчиком на строку перед ошибкой.

   1CProfessional

33 — 24.07.11 — 17:47

ФИОПользователя = ТекФИО;

Сообщить(«»+ФИОПользователя);

мне сообщается введенная мной строка! не пойму — почему документ не хватает в реквизит ФИОПользователя это значение?!

еще раз — делаю это уже в процедуре ПередЗаписью().

   1CProfessional

34 — 24.07.11 — 17:51

как я проверяю и вижу, что реквизиты по документам остаются незаполненными? да вот как:

внешняя обработка с кодом:

//***********************************************************

Процедура РеестрДоков()

   
   
   Выборка = Документы.ЧекККМ.Выбрать(НачДата,КонДата);

   
   Пока Выборка.Следующий() Цикл

       
       Если ПустаяСтрока(Выборка.ФИОПользователя) Тогда

           Сообщить(«»+Выборка+» — нет данных»);

       Иначе

           Сообщить(«»+Выборка+» — «+Выборка.ФИОПользователя);

       КонецЕсли;

       
   КонецЦикла

   
   
   
   
КонецПроцедуры

&НаКлиенте

Процедура РеестрДоков1(Команда)

   // Вставить содержимое обработчика.

   РеестрДоков();

КонецПроцедуры

//НачДата = ТекущаяДата();

//КонДата = ТекущаяДата();

   sanja26

35 — 24.07.11 — 20:04

Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда

убери

   1CProfessional

36 — 24.07.11 — 20:27

(35) не понял! мне это как раз нужно.

   1CProfessional

37 — 25.07.11 — 07:21

ну что — есть мысли?

   МимохожийОднако

38 — 25.07.11 — 07:29

Чтобы шагать в отладчике, надо запустить 1С в режиме отладки. Встаешь на нужную строчку кода в конфигураторе и нажимаешь F5. В меню Отладчик… можно посмотреть различные режимы шагания. Под каждый режим есть своя кнопка на клавиатуре или пиктограмма. Устанавливаешь маркер остановки и начинаешь в 1С Предприятие работать. Когда остановиться программа в указанном месте, то можно посмотреть значения переменных и результат работы используемых в коде методов. А дальше… дальше надо думать почему там не те значения, которые ожидаешь и ставить маркер немного  раньше или в самом начале процедуры, чтобы отследить проблемное место

   1CProfessional

39 — 26.07.11 — 22:50

(38) Спасибо!!!

   1CProfessional

40 — 31.07.11 — 01:17

Нет, вопрос мой не закрыт))

   Reaper_1c

41 — 31.07.11 — 01:20

У кого-то походу дублирующиеся имена реквизитов объектов и форм. Может еще и переменные объявлены.

   1CProfessional

42 — 31.07.11 — 01:21

да нет… не в этом дело

   1CProfessional

43 — 31.07.11 — 01:33

добавил в документ новый реквизит… как теперь его проставить в выборке? перезаписать все доки (около 40 шт.) с заданным этому реквизиту значением (одинаковым пока)?

   1CProfessional

44 — 31.07.11 — 01:38

сделать простановку этого реквизита внешней обработкой.

   GROOVY

45 — 31.07.11 — 03:03

В модуле формы в процедуре «ПередЗаписью» есть параметр, если не ошибаюсь, «ТекущийОбъект», именно в его свойства надо писать то что должно в итоге записаться в базу, так как просто «объект» это данные формы, которые обновятся после отработки транзакции записи. Документацию надо читать, перед тем как что то ваять. И уж совсем дико видеть изменение объекта в событии «ПослеЗаписи»

(43) А какие варианты?

   1CProfessional

46 — 08.08.11 — 09:55

(45) Добавил в документ ЧекККМ свой реквизит (Строка). Нужно реализовать его заполнение произвольными строковыми значениями при вводе новых доков в информационную базу данных. Все, потом будет работать мини-реестр  документов — так же — мной сделанный — на выборку документов с фильтром по этому реквизиту.

   rrunover

47 — 08.08.11 — 10:09

Мне кажется, что ТС игнорирует (4) и (11). Взлетело же бы ведь!

   rrunover

48 — 08.08.11 — 10:14

А, не, не игнорирует. :-)

Интересно, а «ЭтаФорма.ФИОПользователя = ТекФИО;» поможет?

   1CProfessional

49 — 08.08.11 — 12:45

щас попробую ЭтаФорма

   1CProfessional

50 — 08.08.11 — 15:25

если пишу ЭтаФорма… — ругается на неизвестность переменной ФИОПользователя

   1CProfessional

51 — 08.08.11 — 15:25

равно, как и в случае написания Объект.ФИОПользователя

   rrunover

52 — 08.08.11 — 15:57

Так. Давай по порядку.

Судя по коду из (1)

ТекФИО = «»;

Если ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО) Тогда //тут вообще-то ТекФИО не возвращается, а проверяется только на возврат булева.

ФИОПользователя = ТекФИО;

Сообщить(«»+ФИОПользователя);

// Однако в (33) ты пишешь, что отражается, что нужно. Откуда берётся? Код весь давай!

КонецЕсли;

Если директива выполнения перед процедурой/функцией не указана, она будет выполняться на сервере. Для наглядности директиву лучше указывать сразу.

   1CProfessional

53 — 08.08.11 — 16:03

ОбработкаТабличнойЧастиТоварыКлиент.ВводФИОПользователя(ТекФИО)

В ВводФИОПользователя(ТекФИО)

такой код (эту функцию добавил в конфу сам):

Функция ВводФИОПользователя(ФИО) Экспорт

   
   Результат = Ложь;

   
   ФИО = «»;

   Если ВвестиСтроку(ФИО,»Введите свое ФИО.»,50,Ложь) Тогда

       Если Не ПустаяСтрока(ФИО) Тогда

           Результат = Истина;

       КонецЕсли;

   КонецЕсли;

   Возврат Результат;

   
КонецФункции

   1CProfessional

54 — 08.08.11 — 16:05

// Однако в (33) ты пишешь, что отражается, что нужно. Откуда берётся?

именно! сообщается введенное via ВвестиСтроку() строковое значение!!! но к доку оно «не лепится»!

   rrunover

55 — 08.08.11 — 16:08

Молодец, что добавил.

Функция твоя откроет окошко ввода строки… даст пользователю ввести «Давлаташуевич Саша Сашадшуевич»… и коварно возвратит не введённую строку ФИО, а [ДА] Слышишь, ТС? Функция твою возвратит значение хИСТИНА]: да, хозяина-ма, юзера писал-писал, я видела, да. А? Чо писал? Не, не знаю.

   rrunover

56 — 08.08.11 — 16:13

Зачем ты вообще эту обработку используешь?

Хочешь какому-то документу присвоить реквизит, который не отражается на форме?

Пойди _самым_ простым путём: не дописывай существующее, а напиши маленькую, удобную, _свою_ обработочку: на форме два поля. Одно — выбор нужного документа ЧекККМ, второе — то, что нужно присвоить реквизиту документа. Всё. И с УФ по-человечески разберешься и с директивами разберешься.

Да и обработку сможешь выложить и показать, еси чо.

   1CProfessional

57 — 08.08.11 — 17:12

Погоди… Я все тобой написанное, конечно, прочел! И за это — спасибо, тебе!

НО!

Рассказываю для чего это все мне.

Есть магазин с одним ноутом. На нем запущена конфа УТ 11.0 (11.0.6.9). В конфи «сидит» один пользователь — Продавец1. При этом продавцов-консультантов — 3 человека. Вот и появилась нужда в «фамилизации» вводимых в БД доков. Я, вообще, в основном с 7.7 (до сих пор) связан на своей основной работе… Неужели не получится реализовать задуманный мною план?

   rrunover

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

Метки нет (Все метки)


Подскажите, как сделать, чтобы код ниже отрабатывал при проведении документа?
Реквизиты не запишутся, если просто в документе нажать «провести и закрыть», хотя логично же, что процедура «при записи» должна тоже отработать в тот момент

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Процедура ПриЗаписи(Отказ)
    Запрос = Новый Запрос();
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СУММА(РасходыТабЧ.СтоимостьУчастия) КАК ОбщаяСумма,
        |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РасходыТабЧ.Ученик) КАК КоличествоСдавших
        |ИЗ
        |   Документ.Расходы.ТабЧ КАК РасходыТабЧ
        |ГДЕ
        |   РасходыТабЧ.Ссылка = &Ссылка";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
 
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
            ЭтотОбъект.СуммаДокумента= Выборка.ОбщаяСумма;
            ЭтотОбъект.КоличествоСдавших= Выборка.КоличествоСдавших;
            //ЭтотОбъект.Записать(РежимЗаписиДокумента.Проведение, );
            
    конецЕсли;
КонецПроцедуры



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, хм, каша прям из всего.
Если записалось и охота в списке это сразу увидеть — ОбновитьОтображениеДанных() и автообновление 60 секунд например.
Второй вариант через ОбработкуОповещения(), когда документ провелся и там есть ПриЗакрытии() Или ПослеЗаписи() посылать оповещение, а в форме списка ловить.



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



Эксперт 1С

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

Созрел теперь такой вопрос:
создаю документ «X», у него создаю реквизит «Y». В форме документа этот реквизит отображается, в форме списка — нет. Как такое может быть? Точнее, реквизит в форме списке-то есть, но он не заполняется значениями, которые есть в в самом документе. Я эту тему вообще создал из-за того, что у меня изначально именно с этим была связана.



0



Эксперт 1С

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



Эксперт 1С

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



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 16:33

16

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

Без всяких дополнительных примочек, разве не должен отображаться реквизит документа в форме списка, если он нормально вполне отображается в форме самого документа?

Должен.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

27.08.2015, 16:36

 [ТС]

17

Ну тогда тайна сия великая есть.
Я процедуру «перед записью», запрос этот писал, присваивал значение реквизита программно только из-за того, что у меня изначально пустым оставался реквизит в форме списке дока, который отображался в форме дока.



0



Tklwegsd

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

27.08.2015, 16:40

18

Сделай так:

1C
1
2
3
Процедура ПередЗаписью(Отказ)
    СуммаДокумента = 100;
КонецПроцедуры

И убедись, что все работает и отображается сразу.

В конфе проблема в запросе.



0



0 / 0 / 0

Регистрация: 25.07.2015

Сообщений: 32

28.08.2015, 16:10

 [ТС]

19

Запрос вроде бы тоже правильно написал, я проверял через консоль его. Выше сказали, что в процедуре «перед записью» не можно использовать запросы. А как тогда быть?



0



Tklwegsd

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

28.08.2015, 19:21

20

Лучший ответ Сообщение было отмечено s41_blizzard как решение

Решение

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

Запрос вроде бы тоже правильно написал, я проверял через консоль его.

Запрос не работает так как надо, потому что он считывает данные из базы, а так как документ еще не записан, то считываются данные предыдущей версии.

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

Выше сказали, что в процедуре «перед записью» не можно использовать запросы.

Ну там я малость погорячился, запросы конечно же можно использовать. Только в Вашем случае это не спасает по причине, описанной выше.

Цитата
Сообщение от s41_blizzard
Посмотреть сообщение

А как тогда быть?

Как вариант, вычислите значения необходимых реквизитов по текущему состоянию объекта.

1C
1
СуммаДокумента = РасходыТабЧ.Итог("СтоимостьУчастия");



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Пишет, Поле объекта не обнаружено (Номенклатура)

В какой строке?
справочник Номенклатура в базе имеется и он именно так называется? до буковки?

Спасибо за Сказать спасибо



  1. Только начинаю программировать в 8, подскажите что не так делаю: В УТ 10.3 в документе ПеремещениеТоваров нет реквизита «Сумма»(тоже непонятно почему). Сделала реквизит «СуммаДок», в модуль проведения в процедуру ОбработкаПроведения дописала

    СуммаДок = 0;
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    СуммаДок = СуммаДок +ТекСтрокаТовары.Цена*ТекСтрокаТовары.Количество; 
    
    

    Теперь, если открыть документ, нажать на ОК, то сумма появиться, если провести через меню Действия
    Провести, то сумма не заполняется, хотя в отладчике все суммируется. Не пойму что не так делаю.


  2. AlexFF

    Offline

    AlexFF
    Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26

    Так поделитесь опытом с другими :)

  3. При нажатии на кнопку ОК в документе, происходит сначала запись документа и всех реквизитов, а потом проведение, а если провести документ из журнала через меню Действие, то процедура записи не вызывается, документ только проводится, поэтому хоть реквизит и расчитывается правильно, но он не записывается, думаю, что так.


  4. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Присваивать значение реквизиту в обработке проведения — моветон.
    Используйте ПередЗаписью.


  5. sirantd

    Offline

    sirantd

    Регистрация:
    16 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1

    Извиняюсь за поднятие старой темы, но вот такой самый вопрос у меня, а решения тут не увидел. У меня событие ПередЗаписью не вызывается при нажатии на строке в журнале менюшки «Провести». А мне надо запустить перепроведение всех документов определенного типа с изменением некоторых значений в табличных частях.


  6. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Где именно не вызывается? В модуле формы? Там и не должно в этом случае.


  7. sirantd

    Offline

    sirantd

    Регистрация:
    16 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1

    Все, теперь и я понял свою ошибку. Все работает, спасибо огромное :)


  8. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    ОФФ: Есть спец кнопка для этого :)


  9. nbIpKuH_BaH9I

    Offline

    nbIpKuH_BaH9I
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.973
    Симпатии:
    523
    Баллы:
    204

    Пожалуй подниму. У меня есть подписка на событие проведения документа. Где выполняется создание одного справочника. Ссылку на этот справочник я могу получить только после проведения, а мне надо ее записать в реквизит этого же документа. Как такое сделать?


  10. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.592
    Симпатии:
    999
    Баллы:
    204

    Каким образом ссылка на элемент справочника попадает в реквизит проведенного документа?
    Почему нельзя получить ссылку на элемент справочника внутри ПередЗаписью документа?


  11. nbIpKuH_BaH9I

    Offline

    nbIpKuH_BaH9I
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    7.973
    Симпатии:
    523
    Баллы:
    204

    Процедура очень сложная. И выполняется при проведении документов, многих. Именно в момент проведения в зависимости от движений документа формируется элемент справочника. Ну вот схема такая. Я вызываю запись объекта при проведении, но это просто жесть. Походу придется переписывать((((


  12. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.592
    Симпатии:
    999
    Баллы:
    204

    Делать синхронно высоконагруженные операции и при этом еще генерировать транзакции записи в бд — изначально неправильное решение. Как минимум сделать асинхронный механизм.


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Поле объекта недоступно для записи в 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С

При таком конфигурировании реквизита, если это реквизит не заполнен, то при попытке записи элемента, выйдет соответствующая ошибка, и запись элемента не будет осуществлена.

Проверка заполнения реквизита объекта 1С

Данная проверка будет осуществляться независимо от того, сгенерирована эта форма платформой 1С 8.3 автоматически, или используется форма созданная разработчиком.

Проверка заполнения табличной части в 1С

Помимо реквизитов у объектов можно проверять заполнение табличной части.  Для этого у табличных частей объектов имеется свойство «Проверка заполнения», в которое также необходимо установить значение «Выдавать ошибку».

Проверка заполнения табличной части в 1С

Если в этом случае мы попытаемся записать элемент, в котором будет табличная часть без строк, то выйдет ошибка, и записать элемент не получится.

Проверка заполнения табличной части в 1С

В тоже время, мы спокойно сможем записать элемент, у которого имеется строка табличной части с пустыми полями.

Проверка заполнения табличной части в 1С

Если мы хотим проверять реквизиты табличной части, то у них нужно заполнить аналогичное свойство.

Проверка заполнения программно в 1С

Иногда возникает необходимость проверить программно заполнение объекта в 1С. Для этих целей предназначен метод ПроверитьЗаполнение(), который имеется у большинства объектов 1С (справочники, документы и т.д.).

Например, во время программного создания элемента справочника, мы можем проверить заполнение реквизитов этого справочника, перед его записью.

НовОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовОбъект.Наименование = "Товар";
Если НовОбъект.ПроверитьЗаполнение() Тогда
    НовОбъект.Записать();
КонецЕсли;

В этом случае, элемент справочника не будет записан, если у него имеются реквизиты, у которых в свойстве ПроверкаЗаполнения установлено значение «Выдавать ошибку».

Иногда, нужно проверить заполнение реквизита, у которого в свойстве «Проверка заполнения» установлено значение «Не проверять».  Например, у реквизита Артикул справочника Номенклатура.

Проверка заполнения программно в 1С

Если нам нужно осуществлять проверку этого реквизита (например, по какой-то определенной логике), то необходимо в модуле объекта создать метод  ОбработкаПроверкиЗаполнения.

ОбработкаПроверкиЗаполнения в 1С

ОбработкаПроверкиЗаполнения в 1С

У этого метода, который является процедурой, имеется параметр ПроверяемыеРеквизиты. Этот параметр массив, в котором содержится список имен реквизитов, которые нужно проверять. Если в этот список мы добавим название реквизита, то при сохранении элемента будет осуществляться проверка на то, заполнен этот реквизит или нет.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверяемыеРеквизиты.Добавить("Артикул");
КонецПроцедуры
Проверка заполнения программно в 1С

Также, мы можем удалить реквизит из проверяемых, если по какой-то причине нет необходимости в проверке заполнения этого реквизита.

Например, удалим из проверяемых реквизит ПолноеНаименование.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Индекс = ПроверяемыеРеквизиты.Найти("ПолноеНаименование");

    Если Индекс <> 0 Тогда
        ПроверяемыеРеквизиты.Удалить(Индекс);
    КонецЕсли;

КонецПроцедуры

Тогда мы сможем спокойно записать элемент с незаполненным реквизитом ПолноеНаименование.

Проверка заполнения программно в 1С

Если мы хотим проверить программно, что заполнен реквизит табличной части объекта, то необходимо добавить этот реквизит в массив ПроверяемыеРеквизиты по такому формату: [НазваниеТабличнойЧасти].[НазваниеРеквизита] .

Например:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

    ПроверяемыеРеквизиты.Добавить("СписокСвойств.НазваниеСвойства");

КонецПроцедуры

В этом случае, будет осуществляться проверка заполнения реквизита табличной части.

Проверка заполнения программно в 1С

Проверка заполнения формы 1С

Иногда нужно проверить заполнение реквизитов формы.  Разберем небольшую задачу: будем на форме умножать два числа друг на друга, если они заполнены. Создадим на форме реквизиты  с типом Число — Множитель1, Множитель2 и Сумма. У реквизитов Множитель1 и Множитель2 установим в свойство «Проверка заполнения» значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

При выполнении команды Посчитать, произведем расчет только в том случае, если реквизиты заполнены.  Проверку заполнения будем выполнять при помощи метода ПроверитьЗаполнение.

&НаКлиенте
Процедура Посчитать(Команда)

    Если ПроверитьЗаполнение() Тогда

        Сумма = Множетель1 * Множетель2;

    КонецЕсли;

КонецПроцедуры

Теперь мы не сможем посчитать сумму, если один из множителей не заполнен.

Проверка заполнения реквизита объекта 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси
  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 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. Исходные данные для построения маршрута:
* Географические координаты объектов, которые хранятся в базе;
* Координаты начальной и коне


Посмотреть все результаты поиска похожих

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

  • Не заполнено значение реквизита цена в рознице
  • Не менее 12 часов в неделю обязательные работы
  • Новое в индустрии красоты для открытия бизнеса
  • Не могу зайти в сбербанк бизнес онлайн сегодня
  • Новоиерусалимский монастырь время работы храма

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии