Загрузка прайс-листа из EXCEL в справочник Номенклатура, с картинками и иерархией, без установленного MS Office на компьютере

10.08.19

Учетные задачи - Розничная торговля

Загрузка прайс листа из EXCEL или табличного документа 1С MXL с сохранением структуры иерархии. А так же с картинками. При этом нет необходимости устанавливать Mcrosoft Office на компьютер. Загрузка в УТ 11.4

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ЗагрузитьПрайсЛистЭксельНеИспользуяЭксель
.zip 75,85Kb
38
38 Скачать (2 SM) Купить за 2 150 руб.

Дисклеймер:

Данная статья является больше описанием моего собственного опыта решения данного вопроса, но не в кой мере каким-то универсальным решением для всех и каждого. Поэтому заранее прошу прощения за некоторые упущения и тонкости, которые я мог упустить в процессе её написания.

Предисловие:

Захотелось как-то помочь всем тем несчастным вроде меня, кто знает, что можно читать EXCEL и уже не раз загружал что-то из него в 1С. Но вот тут возникла потребность загрузить картинки из ячеек, да так, что бы понимать какой строке таблицы соответствует какая картинка, что очень даже важно, если загружаешь прайс-лист поставщика.

Покопавшись немного в интернете появилось понимание, что EXCEL 2010 никак не предоставляет возможности выдернуть из себя картинку. И многие используют сторонние библиотеки, для переноса картинки из буфера обмена в файл. Источник //infostart.ru/public/16800/ К Сожалению у меня это не заработало. Библиотека регистрируется нормально но не работает, по причине не ясной до сих пор.

Тогда было принято решение поступить радикально и работать не с объектом EXCEL, а непосредственно с табличным документом, так как есть методы позволяющие прочитать файл xlsx и загрузить его в табличный документ и работать уже конкретно с ним. К счастью у табличного документа 1С у рисунка есть метод позволяющий сохранить его в файл, что уже огромный плюс.

Но тут уже встала другая проблема. Как понять какая картинка, какой строке соответствует? Наивно пологая, что через ширину столбцов и строк можно получить координаты картинки, я «наступил на огромные грабли». Вообще мне не понятно почему так происходит? Почему координаты ячейки не соответствуют координатам картинки. Почему нет какого-то соответствия или индекса или ещё чего-то в 1С, что бы можно было это сопоставить. Это был тупик, пока я не наткнулся на маленькую статейку с кодом вот тут:
https://medium.com/1c-tricks/-c146cf0af7d1                
Спасибо автору Дмитрий Марочко, теперь хоть и через костыли, но всё же я мог найти координаты картинки для нужной строки.

Дальше были только мелочные проблемы, например в Экселе есть возможность получить уровень группировки с помощью Лист1.rows(Х).OutlineLevel А вот в табличном документе такого свойства нет. Ещё возникали проблемы при загрузке картинки уже непосредственно в 1С, но это лишь от незнания особенностей конфигурации УТ 11.4

Платформа: 1С:Предприятие 8.3 (8.3.13.1690)
Конфигурация:  Управление торговлей, редакция 11 (11.4.6.207)

Хватит рассусоливать, погнали код.

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

  1. Самое простое – это прочитать Эксель в табличный документ. Тут ничего сложно. Единственное есть нюанс, что чтение происходит на сервере и файл у вас должен быть доступен со стороны сервера. У меня это условие выполнялось, так что тут я особо не заморачивался.
    EXCEL открывается в табличном документе, при этом даже не обязательно, что бы на компьютере был установлен какой-то из продуктов Microsoft Office.

    Объект.ТабДок.Прочитать(Объект.ПутьКФайлу);


    В данном случае Объект.ТабДок – это реквизит на форме типа ТабличныйДокумент. Таким образом, у нас файл EXCEL открывается в табличном документе, при этом даже не обязательно, что бы на компьютере был установлен какой-то из продуктов Microsoft Office.

    Следующий код выполняется на клиенте

  2. Следующим этапом надо определить, где находятся нужные нам колонки. Что бы ни подгонять каждый раз таблицу под какой-то определённый шаблон, чего конечные пользователи делать не будут, я написал алгоритм, который позволяет автоматически определять, в каких колонках какие данные находятся.
    При этом, список данных, которые нужны заранее задан как колонки таблицы значений на форме. В моём случае это: Артикул Аналоги, Бренд, Номенклатура, Применяемость, Цена. Алгоритм анализирует начало таблицы в поисках имён и сам определяет по наименованию в какой колонке какие данные лежат. При этом у меня был довольно таки сложный прайс лист, так как в нём присутствовали повторяющиеся названия в колонках, например слово «номенклатура» встречалось несколько раз. Поэтому было дополнительное условие, выбирающее название колонки с наименьшей длинной.

     

    //Создадим структуру, которая будет хранить номер строки и номер колонки табличного документа в которых расположены соответсвующие данные
    	КолПрайсЛист = Новый Структура;
    	Для каждого Эл из Элементы.ТабЛист.ПодчиненныеЭлементы Цикл
    		КолИмя = НРЕГ(СтрЗаменить(Эл.Имя,"ТабЛист",""));
    		КолПрайсЛист.Вставить(КолИмя+"Строка",0);
    		КолПрайсЛист.Вставить(КолИмя+"Колонка",0);
    		КолПрайсЛист.Вставить(КолИмя+"Длинна",99);//Так как названия колонок могут повторятся, нам нужно выбрать название с минимальной длинной
    	КонецЦикла;
    	
    	Для Х=1 По КоличествоКолонок Цикл  //что бы не по всей таблице ведь мы ищем только шапку а она где-то вверху
    		Для У=1 По КоличествоКолонок Цикл
    			
    			ТекстХУ = НРЕГ(Объект.ТабДок.Область(Х,У,Х,У).Текст);
    			
    			Если СтрНайти(ТекстХУ,"бренд")<>0 тогда
    				КолПрайсЛист.брендСтрока = Х;
    				КолПрайсЛист.брендКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"номенклатура")<>0 тогда //как раз таки слово "Номенклатура" у нас встречается несколько раз
    				Если СтрДлина(ТекстХУ)<=КолПрайсЛист.номенклатураДлинна Тогда
    				  	КолПрайсЛист.номенклатураСтрока = Х;
    					КолПрайсЛист.номенклатураКолонка = У;
    					КолПрайсЛист.номенклатураДлинна =  СтрДлина(ТекстХУ);
    				КонецЕсли;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"артикул")<>0 тогда
    				КолПрайсЛист.артикулСтрока = Х;
    				КолПрайсЛист.артикулКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"аналог")<>0 тогда
    				КолПрайсЛист.аналогиСтрока = Х;
    				КолПрайсЛист.аналогиКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"применяемость")<>0 тогда
    				КолПрайсЛист.применяемостьСтрока = Х;
    				КолПрайсЛист.применяемостьКолонка = У;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"цена")<>0 тогда  //Так же как и цена, так же может быть не одна
    				Если СтрДлина(ТекстХУ)<=КолПрайсЛист.ценаДлинна Тогда
    					КолПрайсЛист.ценаСтрока = Х;
    					КолПрайсЛист.ценаКолонка = У;
    					КолПрайсЛист.ценаДлинна =  СтрДлина(ТекстХУ);
    				КонецЕсли;
    			КонецЕсли;
    			
    			Если СтрНайти(ТекстХУ,"картинка")<>0 тогда
    				КолПрайсЛист.картинкаСтрока = Х;
    				КолПрайсЛист.картинкаКолонка = У;
    			КонецЕсли;
    			
    		КонецЦикла;
    	КонецЦикла;
    
  3. Таким образом мы находим всю шапку табличного документа и здесь же понимаем с какой строки начинать загрузку непосредственно данных. Конкретно в моём случае данные начинались через две строки после шапки, так как и сама шапка высотой в две ячейки.
     

    максимальныйX = 1;
    Для каждого Эл из КолПрайсЛист Цикл
    	Если СтрНайти(Эл.Ключ,"Строка")<>0 Тогда
    		Если максимальныйX<Эл.Значение Тогда
    			максимальныйX = Эл.Значение;
    		КонецЕсли;
    	КонецЕсли;
    КонецЦикла;
    Сообщить("Обход начинается с "+Строка(максимальныйX)+"+2");
    
  4. Дальше происходит непосредственно обход табличного документа по строкам с изъятием данных из колонок, которые мы нашли и добавлением в таблицу значений. Всё это происходит на клиенте.
     

    максимальныйX = максимальныйX + 2;
    	ТабЛист.Очистить();
    	ВремФ = КаталогВременныхФайлов()+"tempIMG.";
    	УровеньГруппировки = 0;
    	
    	//обход по таблице с данными до конца прайс листа. 
    	//Предполагается что у прайс листа нет никаких подвалов, 
    	//тем не менее этот момент тоже предусмотрен и если подвал всё же есть, 
    	//то в таблицу значений не будут добавлены пустые строки
    	Для Х=максимальныйX По КоличествоСтрок Цикл 
    		Если ПустаяСтрока(Объект.ТабДок.Область(Х,КолПрайсЛист.номенклатураКолонка,Х,КолПрайсЛист.номенклатураКолонка).текст) Тогда //Если колонка с номенклатурой пуста, то это скорее всего начало группы. А значит добавляем наименование группы
    			Если НЕ ПустаяСтрока(Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).текст) Тогда //Если нет названия группы, то и не будем ничего создавать
    				Нов = ТабЛист.Добавить();
    				Нов.группа = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).текст;
    				//вот тут интересно. У Экселя есть Лист1.rows(Х).OutlineLevel 
    				//а у табличного документа такого нет, но есть "Отступ (Indent)" который может, хоть и косвенно, но указывать на иерархию, если выгрузка прайс листа идёт из 1С 
    				УровеньГруппировки = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка,Х,КолПрайсЛист.брендКолонка).Отступ/2;//каждый уровень иерархии прибавляет по 2 символа отступа 
    				Нов.УровеньГруппировки = УровеньГруппировки;
    			КонецЕсли;
    		Иначе
    			Нов = ТабЛист.Добавить();
    			Нов.Бренд = Объект.ТабДок.Область(Х,КолПрайсЛист.брендКолонка).текст;
    			Нов.Номенклатура = Объект.ТабДок.Область(Х,КолПрайсЛист.номенклатураКолонка).текст;
    			Нов.Артикул = Объект.ТабДок.Область(Х,КолПрайсЛист.артикулКолонка).текст;
    			Нов.Аналоги = Объект.ТабДок.Область(Х,КолПрайсЛист.аналогиКолонка).текст;
    			Нов.Применяемость = Объект.ТабДок.Область(Х,КолПрайсЛист.применяемостьКолонка).текст;
    			Попытка
    				Нов.Цена = Объект.ТабДок.Область(Х,КолПрайсЛист.ценаКолонка).text;
    			Исключение
    				Сообщить("Не число в "+Строка(Х)+" "+ОписаниеОшибки());
    			КонецПопытки;
    			Нов.УровеньГруппировки = УровеньГруппировки+1; //уровень группировки элемента на уровень больше группы
    			//Создадим временную картинку. 
    			ВремКартинка = Объект.ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
    			ВремКартинка.Имя = "Линейка"+Формат(Х,"ЧН=; ЧГ=");
    			//расположим её в следующей колонке после самой последней, в строке, в которой сейчас находимся
    			ВремКартинка.Расположить(Объект.ТабДок.Область(Х,КоличествоКолонок+1,Х,КоличествоКолонок+1));
    			//Таким образом мы получаем точный отступ сверху для картинки, которая содержит рисунок нашей номенклатуры
    			ТочноеПоложениеКартинки = ВремКартинка.Верх;
    			//Временная картинка больше не нужна
    			Объект.ТабДок.Рисунки.Удалить(ВремКартинка); 			
    			
    			//Обходим коллекцию рисунков и сравниваем отступ сверху с тем, который мы запомнили для данной строки
    			Для каждого Изо ИЗ Объект.ТабДок.Рисунки Цикл
    				Если ИЗО.Верх = ТочноеПоложениеКартинки Тогда  
    					ФК = Изо.Картинка.Формат();
    					Нов.Расширение = Строка(ФК);
    					Изо.Картинка.Записать(ВремФ+Нов.Расширение);  //Когда нашли, сохраняем картинку в файл
    					Нов.Картинка = Новый Картинка(ВремФ+Нов.Расширение); //после этого из файла добавляем её в нашу таблицу значений
    					Прервать;//Для экономии времени, если картинка нашлась, не нужно дальше обходить оставшиеся элементы коллекции
    				КонецЕсли;
    			КонецЦикла;
    			
    		КонецЕсли;
    	КонецЦикла;
    

     

  5. После всего этого весь прайс лист у нас в таблице значений на клиенте. И дальше мы можем обойти таблицу значений и создать как группы справочника, так и элементы с нужными значениями. Заострять на этом внимания я не буду. Тут многое зависит от конфигурации. Лишь покажу, как извлечь картинку из таблицы значений и поместить её в справочник номенклатура. Хоть данный код и справедлив только для УТ 11.4.6.207 но я думаю многим он будет полезен. (Потому что раньше это было просто. Добавляешь объект в ХранилищеДополнительнойИнформации и всё. А вот тут оказалось всё по другому)


     

    Если Не ПустаяСтрока(РасширениеКартинки) Тогда //Это колонка Стр.расширение,, если она не пустая, значит есть картинка в колонке Стр.Картинка
    				Найд = Справочники.НоменклатураПрисоединенныеФайлы.НайтиПоРеквизиту("ВладелецФайла",НовНом.Ссылка);
    				Если ЗначениеЗаполнено(Найд) Тогда  //Если вообще какой-то файл или картинка был загружен ранее, то он удаляется. 
    					Найд.ПолучитьОбъект().Удалить();
    				КонецЕсли;
    				//Помещаем двоичные данные картинки во временное хранилище
    				АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(КартинкаСтроки.ПолучитьДвоичныеДанные(), УникальныйИдентификатор);
    				//Создаём структуру
    				ПараметрыФайлаКартинки = Новый Структура();
    				ПараметрыФайлаКартинки.Вставить("Автор", Пользователи.АвторизованныйПользователь());
    				ПараметрыФайлаКартинки.Вставить("ВладелецФайлов", НовНом.Ссылка);
    				ПараметрыФайлаКартинки.Вставить("ИмяБезРасширения", НовНом.Наименование);
    				ПараметрыФайлаКартинки.Вставить("РасширениеБезТочки", "PNG");
    				ПараметрыФайлаКартинки.Вставить("ВремяИзмененияУниверсальное", ТекущаяДата());
    				//И используем один из механизмов, доступных в УТ 11.4.6.207 
    				ПрисоединенныйФайл = РаботаСФайлами.ДобавитьФайл(
    					ПараметрыФайлаКартинки,
    					АдресФайлаВХранилище,
    					"",
    					"НоменклатураПрисоединенныеФайлы");
    				//Который возвращает нам ссылку на Справочники.НоменклатураПрисоединенныеФайлы
    				НовНом.ФайлКартинки = ПрисоединенныйФайл;
    				//Это значение присваивается реквизиту справочника номенклатура с именем "ФайлКартинки"
    			КонецЕсли;
    

     

  6. По большей части всё. Дальше просто создаёте номенклатуру, затем номенклатуру поставщика, создаёте между ними связь. А затем регистрируете цены поставщика.

Надеюсь, мой пример сэкономит кому-то время и нервы. Я собирал всю информацию около недели, так как нет всего этого в одном месте. Где-то одно, где-то другое. Много всего перепробовал, много не получилось, много ошибок допустил и исправил.R03;R03;R03;R03;R03;R03;R03;

обработка Управление Торговлей Прайс лист загрузка excel табличный документ картинки иерархия

См. также

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    796567    4909    9548    

2861

SALE! 20%

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 7176 руб.

15.12.2015    170843    956    364    

400

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    234291    1062    898    

1003

SALE! 25%

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих, Вики Принт и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5880 4410 руб.

25.05.2015    335633    1958    3058    

1031

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.5, КА 2.5 ,ERP 2.5 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4500 руб.

27.08.2018    122312    1026    584    

864

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

44000 руб.

08.11.2017    122968    292    140    

398
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. fullstack1c 36 06.12.19 09:29 Сейчас в теме
Не совсем универсальный механизм заполнения ТабЛист, по которому в дальнейшем создается номенклатура. Сильно привязано к текущему прайс листу.
2. user1887458 21.12.22 17:59 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?

&НаКлиенте
Процедура ПутьКФотографииНачалоВыбораНаСервере()
	ДД = новый ДвоичныеДанные(ПутьККартинке);
	ЗанестиФотографииНаСервер(ДД); 
	ОбновитьФотографию();
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФотографииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Рисунок png | *.png| Рисунок jpg |*.jpg";
	Если Диалог.Выбрать() Тогда
		ПутьККартинке = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	ПутьКФотографииНачалоВыбораНаСервере();
КонецПроцедуры

Процедура ЗанестиФотографииНаСервер(ДД)
	Об = РеквизитФормыВЗначение("Объект"); 
	Хранилище = новый ХранилищеЗначения(ДД);
	Об.Картинка = Хранилище;    
	Об.Записать();
	ЗначениеВРеквизитФормы(Об,"Объект");
	КартинкаЕсть = Истина;
КонецПроцедуры

Процедура ОбновитьФотографию()
	Картинка = ПоместитьВоВременноеХранилище(Объект.Ссылка.Картинка.Получить(),УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОбновитьФотографию();
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)  
	// Вставить содержимое обработчика.
КонецПроцедуры


&НаКлиенте                                                                                    
Процедура ПриЗакрытии(ЗавершениеРаботы)                                                       
	Если Не Объект.КартинкаЕсть Тогда
		ПриЗакрытииНаСервере();
	КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытииНаСервере()
	Об = РеквизитФормыВЗначение("Объект");
	Хранилище = новый ХранилищеЗначения(Неопределено);
	Об.Картинка = Хранилище;
	Об.Записать();
	ЗначениеВРеквизитФормы(Об, "Объект");
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	Если КартинкаЕсть Тогда
		Объект.КартинкаЕсть = Истина;
	КонецЕсли;
КонецПроцедуры            
Процедура ПередЗаписьюНаСервере()
КонецПроцедуры
Показать
3. пользователь 18.04.23 17:47
Сообщение было скрыто модератором.
...
4. user1887458 19.04.23 09:08 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?


Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОДПРИВЕТСТВЕННОГООКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(картинка) Тогда
ФайлКартинки = ПолучитьИзВременногоХранилища(Картинка);
ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ФайлКартинки); #ПОЛУЧЕНИЕ КАРТИНКИ
УдалитьИзВременногоХранилища(картинка);
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецПроцедуры

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("ты лох" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
5. user1887458 19.04.23 12:59 Сейчас в теме
Здравствуйте, подскажите пожалуйста, правильно ли я сделал?


Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОД ПРИВЕТСТВЕННОГО ОКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(картинка) Тогда
ФайлКартинки = ПолучитьИзВременногоХранилища(Картинка);
ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ФайлКартинки); #ПОЛУЧЕНИЕ КАРТИНКИ
УдалитьИзВременногоХранилища(картинка);
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецПроцедуры

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("Попытки были исчерпаны!" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
6. electrolis 12 20.04.23 07:05 Сейчас в теме
(5)
Общая Форма:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
сообщить(имяпользователя()); #ВЫВОД ПРИВЕТСТВЕННОГО ОКНА
КонецПроцедуры

&Наклиенте
Процедура открыть1(Команда)

СсылкаНаЭлементСправочника = полимя();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлементСправочника);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы); #ССЫЛКА НА ЮЗЕРА
КонецПроцедуры

&Насервере
функция полимя()
возврат справочники.сотрудники.НайтиПоРеквизиту("Логин",имяпользователя()); #ОТКРЫТИЕ СПРАВОЧНИКА
КонецФункции

Справочник «Пользователи»:
&НаКлиенте
Процедура картинкаНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.ПолноеИмяФайла = ""; #ВЫБОР КАРТИНКИ
Фильтр = "Файл Jpg (*.jpg)|*.jpg|Рисунок PNG(*.png)|*.png";
ДиалогОткрытия.Фильтр = Фильтр;
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);
ДиалогОткрытия.Показать(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныйФайл,ДопПараметр) Экспорт
Если ВыбранныйФайл = Неопределено Тогда #КАРТИНКА
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения,, ВыбранныйФайл[0], Ложь, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла,ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
Картинка = Адрес;
Модифицированность = Истина;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(картинка) Тогда
ФайлКартинки = ПолучитьИзВременногоХранилища(Картинка);
ТекущийОбъект.Изображение = Новый ХранилищеЗначения(ФайлКартинки); #ПОЛУЧЕНИЕ КАРТИНКИ
УдалитьИзВременногоХранилища(картинка);
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
картинка = ПолучитьНавигационнуюСсылку(Объект.Ссылка,"Изображение");
КонецПроцедуры

Функция Запись()
НовыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(имяпользователя());
Если НовыйПользователь = Неопределено Тогда
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
НовыйПользователь.Имя = Объект.Логин;
НовыйПользователь.ПолноеИмя = Объект.Наименование;
НовыйПользователь.АутентификацияСтандартная = Истина;
Если Объект.роль=Перечисления.роль.Админ тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Админ); #ДОБАВЛЕНИЕ ЮЗЕРА ПРОГРАММНО
иначеесли Объект.роль=Перечисления.роль.Повар тогда
НовыйПользователь.Роли.Добавить(метаданные.Роли.Повар);
иначе Объект.роль= Перечисления.роль.Пользователь ;
НовыйПользователь.Роли.Добавить(метаданные.Роли.Поль);
Конецесли;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
НовыйПользователь.Записать();
КонецФункции


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ГСЧ = Новый ГенераторСлучайныхЧисел();
число=1;
п=0;
пока п<>3 цикл
а = ГСЧ.СлучайноеЧисло(1, 10);
б = ГСЧ.СлучайноеЧисло(1, 10);
Итог = а+б;

ВвестиЧисло(Число, ""+а+"+"+б+"=?",2);
если число=итог тогда
сообщить("ждлвтпаол");
прервать;
КонецЕсли;
п=п+1;
КонецЦикла;
если п=3 тогда
Режим = РежимДиалогаВопрос.ОК; #КАПЧА
Вопрос(("Попытки были исчерпаны!" ), Режим, 0);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
если не пустаястрока(объект.код) тогда
элементы.Роль.Доступность=ложь;
КонецЕсли;
КонецПроцедуры
Показать


Конечно. а что, не работает?
Оставьте свое сообщение