|
Создание эл-та справочника из документа (8.3) | ☑ | ||
---|---|---|---|---|
0
DenYuliya
18.12.17
✎
15:15
|
Добрый день, коллеги.
Подскажите плиз, как правильно поступить? Стоит задача при проведение документа Поступление (ПТиУ) из каждой строки ТЧ "Товары" создавать новый эл-т справочника "Характеристика номенклатуры", где "Наименование" эл-та спр-ка = "Номер документа + номер строки ТЧ". У меня 2 варианта, откуда это делать: 1) Сделать кнопку на форме "Создать характеристики" и в модуле формы все обрабатывать. 2) В модуле объекта в "При записи" или в "Перед записью". попыталась реализовать первый вариант. &НаКлиенте Процедура СоздатьХарактеристики(Команда) ТекДанные = Элементы.Товары.ТекущиеДанные; Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Иначе СоздатьНовуюХарактеристикуСервер(); КонецЕсли; КонецПроцедуры &НаСервере Процедура СоздатьНовуюХарактеристикуСервер() Для Каждого СтрокаТЧ Из Объект.Товары Цикл НаименованиеХарактеристики = Объект.Номер + "/" + Объект.Дата + "/" + СтрокаТЧ.НомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Характеристика = СтрокаТЧ.Характеристика; Если (НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка()) Или (НоваяХарактеристика = Неопределено) Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; поискГОСТ = Справочники.ркб_ГОСТ.НайтиПоКоду(строкаТЧ.ГОСТ.Код); Если ЗначениеЗаполнено(поискГОСТ) Тогда НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка; КонецЕсли; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; КонецЕсли; Характеристика = НоваяХарактеристика.Ссылка; КонецЦикла; КонецПроцедуры Но в этом случае выдается ошибка: {Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента.Форма(8290)}: Поле объекта недоступно для записи (ГОСТ) НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка; Как обойти эту ошибку? Или правильнее создавать эл-ты справочника в модуле документа, а не формы? ГОСТ - это спр.Ссылка. спр.Характеристики имеет реквизит спр.Гост Форма документа ПТиУ имеет реквизит формы ГОСТ. |
|||
1
nordbox
18.12.17
✎
15:23
|
||||
2
DenYuliya
18.12.17
✎
15:27
|
(1) никакой связи в статье по ссылке с заданным вопросом нет.
|
|||
3
ptiz
18.12.17
✎
15:52
|
(0) Посмотри внимательнее свой код. Я ошибку вижу сразу.
|
|||
4
Lexey_
18.12.17
✎
15:55
|
(0) Зачем искать по коду ссылку, если она уже есть?
поискГОСТ = Справочники.ркб_ГОСТ.НайтиПоКоду(строкаТЧ.ГОСТ.Код); |
|||
5
DenYuliya
18.12.17
✎
15:56
|
(3)
я уже тоже нашла, должно быть не Если ЗначениеЗаполнено(поискГОСТ) Тогда НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка; КонецЕсли; а Если ЗначениеЗаполнено(поискГОСТ) Тогда НовыйЭлемент.ГОСТ = поискГОСТ.Ссылка; КонецЕсли; Но боюсь, дело не в этом, сейчас проверю. |
|||
6
DenYuliya
18.12.17
✎
15:58
|
(4) да)).
Что-то я сглупила, убрала эту часть. Но ошибка явно не в этом, просто избыточность кода получается. |
|||
7
Lexey_
18.12.17
✎
15:58
|
(5) в этом
|
|||
8
hhhh
18.12.17
✎
16:08
|
(6) вот у вас
НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); и должно быть НовыйЭлемент.ГОСТ = поискГОСТ.Ссылка; |
|||
9
DenYuliya
18.12.17
✎
17:33
|
Я, наверное, немного не так сформулировала вопрос.
Надо было, чтобы для каждой Номенклатуры из ТЧ "Товары" документа ПТиУ создавалась характеристика (в спр. ХарактеристикиНоменклатуры), и созданным элементом заполнялся соответствующий реквизит "Характеристика" в ТЧ "Товары" ПТиУ. Так вот, путем незначиельных танцев с бубном Характеристики создаются. Но реквизит "Характеристика" в ТЧ так же остается незаполненным. По-идее можно было, наверное, так: ТекДанные.Характеристика = НоваяХарактеристика; Но ТекДанные у меня "На клиенте"... А создание НовойХарактеристика "НаСервере". Чтобы их за ногу, эти УФ(((. Вроде погуглила этот вопрос в инете, но не поняла, что у меня не так((. |
|||
10
DenYuliya
18.12.17
✎
17:33
|
Если делать так, то ошибок нет, но реквизит "Характеристика" в ТЧ документа все равно пустой:
&НаКлиенте Процедура СоздатьХарактеристики(Команда) ТекДанные = Элементы.Товары.ТекущиеДанные; Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Иначе СоздатьНовуюХарактеристикуСервер(); КонецЕсли; КонецПроцедуры &НаСервере Процедура СоздатьНовуюХарактеристикуСервер() Для Каждого СтрокаТЧ Из Объект.Товары Цикл Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда Продолжить; КонецЕсли; НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата; НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; КонецЕсли; СтрокаТЧ.Характеристика = НоваяХарактеристика; КонецЦикла; КонецПроцедуры |
|||
11
DenYuliya
18.12.17
✎
17:34
|
Подскажите плиз, какой метод/из какого модуля (формы/документа?) надо использовать вместо
СтрокаТЧ.Характеристика = НоваяХарактеристика; ? |
|||
12
Скиурус
18.12.17
✎
17:48
|
Факультативный вопрос, а почему вы ЭТО пихаете в характеристики номенклатуры, а не в партию?
|
|||
13
DenYuliya
18.12.17
✎
17:53
|
(12) потому что)). Объяснять пару листов займет, особенность специфики отрасли.
Скажем так - это решение было выведено путем пары месяцев споров/обсуждений, в том числе с привлечением пары известных франчей. |
|||
14
DenYuliya
18.12.17
✎
17:55
|
(12) ИМХО - "номер документа + номер строки" не очень читабельно и информативно для Характеристики, даже с учетом того, как Характеристику в УТ 11 позиционирует 1С (характеристики&доп.реквизиты...).
Но сра..ся на эту тему с гендиром и ИТ начальником надоело. Хотят они так - пущай будет так. |
|||
15
nordbox
18.12.17
✎
18:01
|
ну вот блин, щазз опять скажешь не то ))
Порядок действий: - получаем характеристику - записываем свойства к характеристике |
|||
16
nordbox
18.12.17
✎
18:23
|
http://www.itland.ru/forum/index.php?showtopic=6466
вот тут есть ответ на твой вопрос, если код читать захочешь |
|||
17
DenYuliya
19.12.17
✎
09:44
|
(16) прочитала. В приведенной статье нет ответа на мой вопрос. Или я совсем слепая.
В приведенной ссылке описан процесс создания элемента (в примере РС, у меня справочника). ВОПРОС НЕ В ЭТОМ! У меня создается элемент справочника в справочник! В (10) описано. В справочнике "ХарактеристикиНом" после нажатия кнопки "СоздатьХарактеристики" на форме документа запись появляется. Но созданный элемент не подставляется в реквизит "Характеристика" в строку ТЧ "Товары" документа ПТиУ. Вопрос в том, как созданный элемент справочника записать в реквизит строки ТЧ. |
|||
18
DenYuliya
19.12.17
✎
09:46
|
(15) да не надо мне создавать характеристику, она у меня создается нормально))))! И свойства у нас вообще не используются.
Мне надо созданный элемент справочника запихнуть в строку ТЧ, в реквизит. У меня это не получается))). |
|||
19
FIXXXL
19.12.17
✎
09:50
|
(18) покажи код, как в строку пихаешь
|
|||
20
DenYuliya
19.12.17
✎
09:51
|
&НаКлиенте
Процедура СоздатьХарактеристики(Команда) ТекДанные = Элементы.Товары.ТекущиеДанные; Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Иначе СоздатьНовуюХарактеристикуСервер(); КонецЕсли; КонецПроцедуры &НаСервере Процедура СоздатьНовуюХарактеристикуСервер() Для Каждого СтрокаТЧ Из Объект.Товары Цикл Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда Продолжить; КонецЕсли; НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата; НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; КонецЕсли; СтрокаТЧ.Характеристика = НоваяХарактеристика; КонецЦикла; КонецПроцедуры Мне кажется, что проблема в этой части: СтрокаТЧ.Характеристика = НоваяХарактеристика; Может я что-то не доделала просто? Ошибок после выполнения нету, но "СтрокаТЧ.Характеристика" в документе(!) остается незаполненной. Элемент в справочнике - создается, но не подставляется. |
|||
21
PiotrLoginov
19.12.17
✎
09:51
|
Так. Много букв. Можно еще раз кратко сформулировать, в чем сейчас "затык"?
Если в заполнении реквизита, то кто мешает пройтись по ТЧ объекта и заполнить этот реквизит? В чем проблема? |
|||
22
PiotrLoginov
19.12.17
✎
09:52
|
(20) Тип значения реквизита и создаваемого элемента совпадает?
|
|||
23
PiotrLoginov
19.12.17
✎
09:53
|
тут три сосны. Заблудиться невозможно.
|
|||
24
FIXXXL
19.12.17
✎
09:53
|
(20) типы значений в отладчике сравни
|
|||
25
hhhh
19.12.17
✎
09:59
|
(20) проверь может у номенклатуры не включено использование характеристик.
|
|||
26
DenYuliya
19.12.17
✎
10:00
|
(21) Проблема в заполнить реквизит созданными элементами справочника.
Мешает незнание, как это сделать. Создается элемент - &НаСервере (в (20) ) &НаСервере Процедура СоздатьНовуюХарактеристикуСервер() "Пройтись и присвоить значение" - вроде бы &НаКлиенте через ТекущиеДанные надо делать. (в (20) ) &НаКлиенте Процедура СоздатьХарактеристики(Команда) Как передать с серверной на клиентскую созданный элемент? Пыталась сделать так - не верно, ошибка (текст не помню, щас посмотрю, если надо): &НаКлиенте Процедура СоздатьХарактеристики(Команда) ТекДанные = Элементы.Товары.ТекущиеДанные; парХарактеристика = ТекДанные.Характеристика; Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Иначе СоздатьНовуюХарактеристикуСервер(парХарактеристика); КонецЕсли; КонецПроцедуры &НаСервере Процедура СоздатьНовуюХарактеристикуСервер(парХарактеристика) Для Каждого СтрокаТЧ Из Объект.Товары Цикл Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда Продолжить; КонецЕсли; НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата; НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; КонецЕсли; парХарактеристика = НоваяХарактеристика; КонецЦикла; КонецПроцедуры |
|||
27
DenYuliya
19.12.17
✎
10:02
|
(25) включено. Иначе бы характеристика не создавалась и "характеристика" не было бы обязательным для заполнения реквизитом ПТиУ - это как минимум).
(22),(24) вроде вчера все проверяла - спр.Ссылка.ХарактеристикиНом , но сейчас еще раз посмотрю, конечно. |
|||
28
PiotrLoginov
19.12.17
✎
10:04
|
(26)
это можно делать на сервере. В (20) код "СтрокаТЧ.Характеристика = НоваяХарактеристика;" правильный В типовых как программное дозаполнение ТЧ происходит? На клиенте, если это возможно. А если необходим вызов сервера, то всё происходит на сервере. Это нормально. |
|||
29
DenYuliya
19.12.17
✎
10:07
|
(28) да вот и я что-то понять не могу((.
Я так на днях буквально заполняла обработкой, правда справочник... Да я с клиент-сервером на "вы" пока что, вот и засомневалась, вдруг что-то упустила... |
|||
30
hhhh
19.12.17
✎
10:12
|
(29) ТекДанные = Элементы.Товары.ТекущиеДанные; - выкинь
потому что ты в Для Каждого СтрокаТЧ Из Объект.Товары Цикл ты все строки заполняешь, а не только текущую парХарактеристика выкинь потому что ты в Для Каждого СтрокаТЧ Из Объект.Товары Цикл ты все строки заполняешь, а не только текущую парХарактеристика = НоваяХарактеристика; выкинь, до этого у тебя правильно было. |
|||
31
DenYuliya
19.12.17
✎
10:16
|
(30)это я показала, как пробовала раньше, так не работает.
Хотя в принципе , как в (20) тоже не работает почему-то)). |
|||
32
hhhh
19.12.17
✎
10:18
|
(30) а вообще-то где-то так
&НаКлиенте Процедура СоздатьХарактеристики(Команда) ТекДанные = Элементы.Товары.ТекущиеДанные; Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Иначе ТекДанные.Характеристика = СоздатьНовуюХарактеристикуСервер(ТекДанные.НОменклатура, ТекДанные.НомерСтроки); КонецЕсли; КонецПроцедуры &НаСервере Функция СоздатьНовуюХарактеристикуСервер(парНоменклатура, парНомерСтроки) Если Не ЗначениеЗаполнено(парНоменклатура) Тогда Возврат НЕопределено; КонецЕсли; НаименованиеХарактеристики = Объект.Номер + "/" + парНомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = парНоменклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + парНомерСтроки + "/" + Объект.Дата; НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; КонецЕсли; Возврат НоваяХарактеристика; КонецФункции |
|||
33
Dmitrii
гуру
19.12.17
✎
10:26
|
ОФФ. Какое забавное решение...
А что произойдёт, если в документе ПТиУ, по которому номенклатуру уже списали (продали или пустили в производство) вдруг задним числом поменяли порядок строк (переместили строки, добавили строку в середине, удалили строку из середины и т.п.)? Создадутся новые характеристики на каждую строку? А что в документах списания? - там как поменяется характеристика? Зачем вообще нужен номер строки в характеристике? (0) >> У меня 2 варианта... на форме ... В модуле объекта Делать надо либо оба, либо только второй. Ограничиться только первым нельзя так как документ может создаваться программно (без использования формы). А еще надо не забыть про обработки заполнения (например, при копировании, чтобы характеристики очищались). |
|||
34
Мимохожий Однако
19.12.17
✎
10:31
|
Отладчиком пошагово с проверкой подставляемых значений....Кофе у всех закончится от гадания.
|
|||
35
DenYuliya
19.12.17
✎
10:42
|
//Денисенко
&НаКлиенте Процедура СоздатьХарактеристики(Команда) Если Параметры.Ключ.Пустая() Тогда ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10); Возврат; КонецЕсли; СоздатьНовуюХарактеристикуСервер() КонецПроцедуры &НаСервере Процедура СоздатьНовуюХарактеристикуСервер() Для Каждого СтрокаТЧ Из Объект.Товары Цикл Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда Продолжить; КонецЕсли; НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки; НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики); Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура; НовыйЭлемент.Наименование = НаименованиеХарактеристики; НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата; НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ; НовыйЭлемент.ДокументПоступления = Объект.Ссылка; НовыйЭлемент.Записать(); НоваяХарактеристика = НовыйЭлемент.Ссылка; Иначе Сообщить("Такая характерстика для номенклатуры " + СтрокаТЧ.Номенклатура + "уже существует!",СтатусСообщения.ОченьВажное); Возврат; КонецЕсли; СтрокаТЧ.Характеристика = НоваяХарактеристика; КонецЦикла; КонецПроцедуры Так - работает. мистика какая-то, вчера не работало. Сейчас сравню с тем, что вчера в тему выкладывала, но вроде бы ничего не меняла... |
|||
36
DenYuliya
19.12.17
✎
10:44
|
(33) номер строки в характеристике - для уникальности наименования.
За ваши вопросы и дополнения - спасибо, подумаю над ними. |
|||
37
DenYuliya
19.12.17
✎
10:47
|
Ничего не понимаю (((. (35) и (10) код одинаковый. Вчера не работало. Сегодня заработало. Все создается и заполняется норм.
Ночью перезапускли сервер... Барабашки шалят что ли? |
|||
38
PiotrLoginov
19.12.17
✎
11:04
|
(37) вчера не надо было столько столько работать. Отдых тоже нужен. Цвет кожи восстанавливается, мысли приводятся в порядок, барабашки перестают шалить... ну и вообще настроение повышается
|
|||
39
DenYuliya
19.12.17
✎
11:12
|
(38) это точно))))
|
|||
40
FIXXXL
19.12.17
✎
11:42
|
"Миста - лучший отладчик" (с)
и бубен :) |
|||
41
Альбатрос
19.12.17
✎
11:46
|
(33) Старые хар-ки на удаление метятся, новые заводятся.
(0) Посмотри конфу "Управление аптечной сетью". Один в один реализованы твои хотелки. |
|||
42
DenYuliya
19.12.17
✎
11:52
|
(41) спасиб, поищу. Даже не слышала о такой.
Посидели, подумали с начальником- с "Номером стр" и правда дурная идея, (33) прав. Сейчас что-нибудь еще подумаю)) |
|||
43
Альбатрос
19.12.17
✎
12:10
|
(42) Я бы не сказал, что дурная. Своеобразная это да.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |