|   |   | 
| 
 | Работа с доп.реквизитами ↓ (Волшебник 21.12.2023 22:31) | ☑ | ||
|---|---|---|---|---|
| 0
    
        stajer666 21.12.23✎ 10:49 | 
        В общем, задача следующая:
 Есть эксель файлик, который открывается, далее идет его обработка и запись в справочник, на этом моменте должна быть проверка элементов на уникальность, в табличке эксель она задается инв. номером, в конфигурации такого реквизита нет, потому добавил доп. реквизит Проблема в следующем - не получается обратиться к значению доп. реквизита, чтобы сравнить с ним инв. номер из таблички эксель, также и не получается записать в него)) Ну просто никак не выходит рабочий код, даже показывать что-то из моих потугов стыдно Такие вот задачки дают стажерам, отработавшим 3 дня)) | |||
| 1
    
        Волшебник 21.12.23✎ 10:54 | 
        Не стыдитесь. Покажите программный код     | |||
| 2
    
        stajer666 21.12.23✎ 11:00 | 
        СвойствоИдентификатора = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ИнвНомераИзФайлаExcel");
 "ВЫБРАТЬ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка КАК Ссылка, | ОсновныеСредстваДополнительныеРеквизиты.Свойство КАК Свойство, | ОсновныеСредстваДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Справочник.ОсновныеСредства.ДополнительныеРеквизиты КАК ОсновныеСредстваДополнительныеРеквизиты |ГДЕ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка = &Ссылка | И ОсновныеСредстваДополнительныеРеквизиты.Свойство = &ИнвНомераИзФайлаExcel"; Запрос.УстановитьПараметр("Свойство", СвойствоИдентификатора); Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); СсылкаНаОС = Справочники.ОсновныеСредства.ПустаяСсылка(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КонецЦикла; Если НЕ ЗначениеЗаполнено(СсылкаНаОС) Тогда ОС = Справочники.ОсновныеСредства.СоздатьЭлемент(); Иначе ОС = СсылкаНаОС.ПолучитьОбъект(); КонецЕсли; СтруктураОтбора = Новый Структура("Свойство", СвойствоИдентификатора); НайденныеСтроки = ОС.ДополнительныеРеквизиты.НайтиСтроки(СтруктураОтбора); Если НайденныеСтроки.Количество() > 0 Тогда СтрокаДляРедактирования = ОС.ДополнительныеРеквизиты.Добавить(); КонецЕсли; СтрокаДляРедактирования.Свойство = СвойствоИдентификатора; СтрокаДляРедактирования.Значение = "123"; Начальник накидал такой код для примера, дергать его по каждому пункту, понятное дело, я не могу в конце "123" - строка с инв.номером, которую я вытяну из файла эксель непонятно следующее: что вообще такое Ссылка, что туда вставлять, да и как оно работает в принципе тоже не понимаю | |||
| 3
    
        Волшебник 21.12.23✎ 11:01 | 
        здесь пустой цикл
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КонецЦикла; | |||
| 4
    
        stajer666 21.12.23✎ 11:02 | 
        Мне нужно как-то сравнивать мой инв.номер из файла эксель со всеми значениями доп.реквизита в справочнике, если такого не найдется, создавать новый элемент и вписывать в него инв. номер в доп.реквизит     | |||
| 5
    
        stajer666 21.12.23✎ 11:05 | 
        (3) честно, я без малейших идей, что он должен делать, пытался донести до начальника, что в запросах я вообще не ку-ку, буквально ни одного не создал за свое время обучения, но он все равно дал мне его     | |||
| 6
    
        Волшебник 21.12.23✎ 11:05 | 
        Здесь ошибки:
 |ГДЕ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка = &Ссылка | И ОсновныеСредстваДополнительныеРеквизиты.Свойство = &ИнвНомераИзФайлаExcel"; Запрос.УстановитьПараметр("Свойство", СвойствоИдентификатора); Запрос.УстановитьПараметр("Ссылка", Ссылка); Правильнее так: |ГДЕ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка = &Ссылка | И ОсновныеСредстваДополнительныеРеквизиты.Свойство = &Свойство | И ОсновныеСредстваДополнительныеРеквизиты.Значение = &ИнвНомераИзФайлаExcel"; | |||
| 7
    
        Волшебник 21.12.23✎ 11:05 | 
        (5) Вас надо уволить с позором     | |||
| 8
    
        Смотрящий 21.12.23✎ 11:09 | 
        (3) Он в тебя верит. Даже если ты не веришь в Него. ))     | |||
| 9
    
        stajer666 21.12.23✎ 11:10 | 
        (7) ну, тут так и не скажи, для меня, как для стажера, задачка кажется довольно непростой
 это ж сначала надо написать часть с открытием файла эксель, потом его запись в справочник, а после создание документа да и везде куча нюансов с отбором по строками, колонками, занесением части колонок в комментарии и тд | |||
| 10
    
        stajer666 21.12.23✎ 11:11 | 
        (9) к тому же это все реализуется не одной кнопкой, а двумя, одна записывает Основные средства с определенной строки, другая ТМЦ, с ТМЦ проблем не возникло, так как там у всех элементов уникальные наименования, а с ОС приходится возиться     | |||
| 11
    
        stajer666 21.12.23✎ 11:12 | 
        (6) эту част подправил, пустой цикл закомментировал, но догадок, что делать дальше, у меня нет))
 может, можно как-то проще реализовать через БСП? там тоже пытался повозиться некоторое время, но пришел к тому же результату | |||
| 12
    
        shuhard 21.12.23✎ 11:14 | 
        (11) иди в курьеры - не позорься     | |||
| 13
    
        stajer666 21.12.23✎ 11:16 | 
        мужички, чего ж вы так обозлились, за неделю изучения я и так многое постиг, пришел вот к вам, за советом к старшим     | |||
| 14
    
        Волшебник 21.12.23✎ 11:18 | 
        (11) пустой цикл не надо было комментировать, его надо было наполнить смыслом     | |||
| 15
    
        Eiffil123 21.12.23✎ 11:45 | 
        (0) попробуйте что-то типа такого:
 Процедура СформироватьОбъектОС(ПараметрыОС) СвойствоИдентификатора = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ИнвНомераИзФайлаExcel"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка КАК Ссылка, | ОсновныеСредстваДополнительныеРеквизиты.Свойство КАК Свойство, | ОсновныеСредстваДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Справочник.ОсновныеСредства.ДополнительныеРеквизиты КАК ОсновныеСредстваДополнительныеРеквизиты |ГДЕ | ОсновныеСредстваДополнительныеРеквизиты.Свойство = &Свойство | И ОсновныеСредстваДополнительныеРеквизиты.Значение = &ИнвНомер"; Запрос.УстановитьПараметр("Свойство", СвойствоИдентификатора); Запрос.УстановитьПараметр("ИнвНомер", ПараметрыОС.ИнвНомер); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда // Тут наверно ничего не делаем Иначе ОС = Справочники.ОсновныеСредства.СоздатьЭлемент(); // Заполнение реквизитов //ОС.Наименование = ... //ОС. .... // Заполнение доп.реквизита: СтрокаДР = ОС.ДополнительныеРеквизиты.Добавить(); СтрокаДР.Свойство = СвойствоИдентификатора; СтрокаДР.Значение = ПараметрыОС.ИнвНомер; СтрокаДР.ТекстоваяСтрока = ПараметрыОС.ИнвНомер; ОС.Записать(); КонецЕсли; КонецПроцедуры | |||
| 16
    
        stajer666 21.12.23✎ 11:46 | 
        (15) спасибо! сейчас попробую     | |||
| 17
    
        zelenprog 21.12.23✎ 11:51 | 
        Посмотри, я когда-то делал процедуру для чтения доп-реквизитов для всех объектов, указанных в ТЗ:
 Процедура ПолучитьДопРеквизиты_ДляТЗ (пТЗ, пКолонкаОбъекта, пТЗИмяДопРеквизитов) лМассивПартнеров = пТЗ.ВыгрузитьКолонку(пКолонкаОбъекта); пТЗДопРеквизитыКонтрагентов = УправлениеСвойствами.ЗначенияСвойств(лМассивПартнеров, Истина, Ложь); пТЗДопРеквизитыКонтрагентов.Индексы.Добавить("ВладелецСвойств, ИмяСвойства"); Для Каждого лСтрокаТЗКонтрагенты из пТЗ Цикл Для Каждого лСтрокаТЗИмяДопРеквизитов из пТЗИмяДопРеквизитов Цикл лНазваниеКолонкиДопРеквизита = лСтрокаТЗИмяДопРеквизитов.ИмяРеквизита; лИмяРеквизитаДляРазработчика = лСтрокаТЗИмяДопРеквизитов.ИмяРеквизитаДляРазработчика; лПараметрыОтбора = Новый Структура("ВладелецСвойств, ИмяСвойства", лСтрокаТЗКонтрагенты[пКолонкаОбъекта], лИмяРеквизитаДляРазработчика); лМассивНайденныхСтрок = пТЗДопРеквизитыКонтрагентов.НайтиСтроки(лПараметрыОтбора); Если лМассивНайденныхСтрок.Количество() >= 1 Тогда лНайденнаяСтрока = лМассивНайденныхСтрок[0]; лСтрокаТЗКонтрагенты[лНазваниеКолонкиДопРеквизита] = лНайденнаяСтрока.Значение; КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры Описание параметров: пТЗ - это ТаблицаЗначений. Одна из колонок - это объекты БД, для которых нужно найти допреквизиты (*). Другие колонки - куда будут записаны доп-реквизиты (**). Колонки могут иметь произвольные названия. пКолонкаОбъекта - это имя колонки в пТЗ, в которой записаны объекты, для которых нужно найти допреквизиты (*). пТЗИмяДопРеквизитов - это имена колонок в пТЗ, которые нужно заполнить значениями допреквизитов (**). | |||
| 18
    
        stajer666 21.12.23✎ 11:56 | 
        (17) и тебе огромное спасибо! 
 как что-то дельное выйдет, сразу отпишу | |||
| 19
    
        Donkey_hot 21.12.23✎ 11:56 | 
        (0) Пользуйтесь методами БСП и будет Вам счастье.     | |||
| 20
    
        Donkey_hot 21.12.23✎ 11:58 | 
        (11) А чего там возиться, Вам нужно две функции - ЗначениеСвойства() и ЗаписатьСвойстваУОбъедка()     | |||
| 21
    
        zelenprog 21.12.23✎ 12:00 | 
        (17)+ 
 Пример использования этой процедуры: 1) создаешь ТЗ, например вот такой структуры: МояТЗ = Новый ТаблицаЗначений; МояТЗ.Колонки.Добавить("Контрагент"); МояТЗ.Колонки.Добавить("GUIDГрузополучателя"); МояТЗ.Колонки.Добавить("GUIDМеркурий"); 2) Записываешь в колонку "Контрагент" те объекты, для которых будешь искать доп-реквизиты 3) создаешь ТЗИмяДопРеквизитов ТЗИмяДопРеквизитов = Новый ТаблицаЗначений; ТЗИмяДопРеквизитов.Колонки.Добавить("ИмяРеквизита"); ТЗИмяДопРеквизитов.Колонки.Добавить("ИмяРеквизитаДляРазработчика"); //---- лСтр = ТЗИмяДопРеквизитов.Добавить(); лСтр.ИмяРеквизита = "GUIDГрузополучателя"; лСтр.ИмяРеквизитаДляРазработчика = "GUIDГрузополучателя_8030890e1ef34e218ad492c1a44ea512"; //---- лСтр = ТЗИмяДопРеквизитов.Добавить(); лСтр.ИмяРеквизита = "GUIDМеркурий"; лСтр.ИмяРеквизитаДляРазработчика = "GUIDМеркурий_6e5828b4732c437dbdf8a76fb81e9db2"; 4) Вызываешь процедуру: ПолучитьДопРеквизиты_ДляТЗ (МояТЗ, "Контрагент", ТЗИмяДопРеквизитов). У меня работает. | |||
| 22
    
        zelenprog 21.12.23✎ 12:02 | 
        (20) Я когда-то очень долго искал эти две функции. Пришлось рыться по общим модулям.
 Познание БСП - это процесс очень долгий. Кстати, есть какое-нибудь более-менее полное описание БСП? | |||
| 23
    
        Donkey_hot 21.12.23✎ 12:08 | 
        (22) Документация на ИТС недостаточно полна, с Вашей точки зрения?     | |||
| 24
    
        stajer666 21.12.23✎ 12:14 | 
        (20) тут все несколько сложнее
 у меня есть отдельная процедура для записи всех остальных реквизитов, комментариев, сообщений для пользователей и тд я сначала пытался через функция возвращать значение истина/ложь, есть ложь - создаем новый элемент, истина - ничего не делаем как бы саму таблицу значений с доп.реквизитами из БСП у меня получалось вытащить, прописывал потом поиск строк, но чет не хотел работать тот вариант, не знаю, что было не так | |||
| 25
    
        zelenprog 21.12.23✎ 12:30 | 
        (23) Не всегда удобно сидеть в интернете на сайте.
 Иногда хочется взять что-то типа книги. Или в бумажном в виде, или в электронном. | |||
| 26
    
        zelenprog 21.12.23✎ 12:30 | 
        (24) А что сейчас не получается?     | |||
| 27
    
        stajer666 21.12.23✎ 12:33 | 
        (26) думаю, сейчас все будет норм, дорабатываю процедуру из (15) , чтобы у меня все корректно записывалось     | |||
| 28
    
        stajer666 21.12.23✎ 17:16 | 
        в общем, сделал я)
 такая вот функция Функция ПроверкаИнвентароногоНомера(ЗначениеИнвент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновныеСредстваДополнительныеРеквизиты.Ссылка КАК Ссылка, | ОсновныеСредстваДополнительныеРеквизиты.Свойство КАК Свойство, | ОсновныеСредстваДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Справочник.ОсновныеСредства.ДополнительныеРеквизиты КАК ОсновныеСредстваДополнительныеРеквизиты |ГДЕ | ОсновныеСредстваДополнительныеРеквизиты.Значение = &ЗначениеИнвент | И ОсновныеСредстваДополнительныеРеквизиты.Свойство = &инв"; Запрос.УстановитьПараметр("ЗначениеИнвент", ЗначениеИнвент); Запрос.УстановитьПараметр("Инв", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ЛСИнвНомераИзФайлаExcel")); РезультатЗапроса = Запрос.Выполнить(); Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции и такая обработка дальше УжеЕстьТакаяНоменклатура = ПроверкаИнвентароногоНомера(ПолученныйИнвНомер); ...... ДопРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ЛСИнвНомераИзФайлаExcel"); ЕстьСтроки = ОбъектОС.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит));//Пусть результатом поиска будут "ЕстьСтроки" Если ЕстьСтроки.Количество() = 0 Тогда СтрокаТЧ = ОбъектОС.ДополнительныеРеквизиты.Добавить(); СтрокаТЧ.Свойство = ДопРеквизит; Иначе СтрокаТЧ = ЕстьСтроки[0]; КонецЕсли; СТрокаТЧ.Значение = ПолученныйИнвНомер; ОбъектОС.Записать(); иначе Сообщить("Уже есть " + ПолученныйИнвНомер); | |||
| 29
    
        Donkey_hot 21.12.23✎ 17:26 | 
        (28) И, видимо, все это мероприятие в цикле?     | |||
| 30
    
        bolobol 21.12.23✎ 17:36 | 
        Переделать!     | |||
| 31
    
        Eiffil123 21.12.23✎ 17:51 | 
        (29) объектов ос наверняка не так уж много (не более 100к), чтоб обращать внимание на оптимизацию кода     | |||
| 32
    
        Волшебник 21.12.23✎ 22:35 | 
        (31) Запросы в цикле потом войдут в привычку     | |||
| 33
    
        Волшебник 21.12.23✎ 22:40 | 
        Нейронка запомнит, что запросы циклах работают и так нормально. В 90% случаев так и будет. Сервера будут справляться, потому что базулька будет целиком помещаться в память.     | |||
| 34
    
        stajer666 22.12.23✎ 09:05 | 
        (31) конкретно для ОС не наберется и 300 элементов, а за раз планируется записывать по 20-30 позиций     | |||
| 35
    
        stajer666 22.12.23✎ 09:12 | 
        (30) друг, так предложи свой вариант решения, я ж не против посмотреть
 знал бы, как сделать лучше - так бы и поступил, а так это мой первый опыт в 1с, хочется получить хотя бы рабочий вариант | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |