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

10.08.19

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

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

Скачать файлы

Наименование Файл Версия Размер
ЗагрузитьПрайсЛистЭксельНеИспользуяЭксель
.zip 75,85Kb
36
.zip 75,85Kb 36 Скачать

Дисклеймер:

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

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

Захотелось как-то помочь всем тем несчастным вроде меня, кто знает, что можно читать 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 табличный документ картинки иерархия

См. также

SALE! 20%

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

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

28500 22800 руб.

21.04.2017    90167    105    39    

190

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Платформа 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

4800 руб.

27.02.2017    762966    4668    9495    

2781

ЕГАИС++. Опт, производство, импорт

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

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

8970 руб.

15.12.2015    165950    679    362    

385

SALE! 10%

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 9504 руб.

29.10.2014    210146    620    524    

439

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

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

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110319    34    114    

178

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150702    367    375    

501
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. fullstack1c 35 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);
отказ=истина;
ПрекратитьРаботуСистемы();
КонецЕсли;

Запись();

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

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


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