Задача упрощается )) Номенклатура отображается всегда вся, но остатки надо только по выбранному складу.
ВЫБРАТЬ СправочникНоменклатура.*, ТоварыОстатки.Номенклатура, ТоварыОстатки.КоличествоОстаток ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Товары.Остатки(, Склад = &Склад) КАК ТоварыОстатки ПО (ТоварыОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
Если не сложно, то немного про этот инструмент. Что это такое и как это может заменить операцию с определенным количеством проводок по бухгалтерским счетам?
Документ это и есть операция и он отражает "комплект" нужных проводок, которыми запрограммирован
В этой статье я постараюсь описать процесс парсинга сайтов средствами 1С с примером. Это статья не является инструкцией к применению, а лишь демонстрирует возможности 1С.
Что мы имеем?
1. Сайт в интернете, на котором располагается список товаров. В моем случае – это интернет магазин салона «Связной» 2. Понимание основ сайтостроения… хотя бы знание HTML тегов 3. Умение кодить в 1С 8
Все вышеперечисленные пункты в арсенале? Тогда читаем далее
Для начала парсинга стоит определиться с тем что мы хотим спарсить и какая у нас будет иерархия. В моем случае это категория сотовых телефонов. Верхний уровень иерархии будет производители. Почему именно так? Потомы что я так захотел. Вы же вправе использовать любую иерархию.
Далее нам будут интересны такие поля как: Наименование, Цена, Картинка и Описание... ну и пожалую захватим операционную систему, чтобы пример получился более наглядным.
1. Создаем внешнюю обработку. Те, кто не знают как это сделать - дальше могут не читать 2. Создаем форму обработки с командной панелью снизу и сверху (они могут быть полезными) 3. Размещаем на ней Панель и обзываем первую страницу "СамСайт" 4. Кладем на страницу "СамСайт" ПолеHTMLДокумента и обзываем его к примеру "Сайт" 5. Переименовываем кнопку "Выполнить", которая находится на нижней панели в "Загрузить сайт" 6. Описываем процедуру нажатия на эту кнопку так:
ЭлементыФормы.Сайт.Перейти("http://www.svyaznoy.ru/catalog/phone/224");//Категория с мобильными телефонами
7. Проверяем работу нашей обработки. У меня появился сайт связного. А у Вас?
Дальше сложнее. Все еще хочешь парсить сайты? Тогда читай
Сам парсинг сайта заключается в обходе всех элементов загруженной страницы, выдергивания необходимой информации и запихивания их в табличную часть. Для это
1. Создадим табличную часть "Производители" с реквизитами "Отметка" (Булево), "Наименование" (Строка 100) и "Ссылка" (Строка 300). 2. Добавляем еще одну страницу на панели и обзываем ее "Производители" 3. Размещаем на этой странице одноименную табличную часть 4. Добавляем на нижней панели кнопку "Заполнить производителей" с кодом:
Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл Если Стр.tagName = "H1" и Стр.innerText = "Производители" Тогда Для Каждого опСтр из Стр.nextSibling.children Цикл новСтр = Производители.Добавить(); новСтр.Наименование = опСтр.innerText; новСтр.Ссылка = опСтр.firstChild.href; КонецЦикла; Возврат; КонецЕсли; КонецЦикла;
Здесь напрашиваются небольшие пояснения: tagName - имя HTML тега в HTML документе nextSibling - следующий элемент HTML документа от текущего children - список дочерних элементов firstChild - первый дочерний элемент от текущего 5. Проверям. При проверке важно, находиться на странице "СамСайт", чтобы заполнять производителей
Производители заполнены. Теперь к самим телефонам
1. Создаем табличную часть "Товары" с реквизитами "Производитель" (Строка 100), "Наименование" (Строка 100), "Цена" (Число 10,2), "Картинка" (Строка 300), "Описание" (Строка Неограниченная), "ОС" (строка 100), "Ссылка" (Строка,300) 2. Добавляем еще одну страницу на панели и обзываем ее "Товары" 3. Размещаем на этой странице одноименную табличную часть 4. Добавляем на нижней панели кнопку "Заполнить товары" с кодом:
Для Каждого Стр из Производители Цикл //Если отметку сняли - то не трогаем этого производителя Если Не Стр.Отметка Тогда Продолжить; КонецЕсли; Форма = ПолучитьФорму("ФормаТоваров"); Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка); Форма.ТекущийПроизводитель = Стр; Форма.ОткрытьМодально(); КонецЦикла;
5. Создаем форму обработки "ФормаТоваров" 6. Кладем на "ФормаТоваров" ПолеHTMLДокумента и называем его "Сайт" 7. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:
Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда ГрузимТовары(); КонецЕсли;
8. Создаем переменную в модуле формы перем ТекущийПроизводитель Экспорт; 9. Создаем процедуру ГрузимТовары():
Процедура ГрузимТовары() Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл Если Стр.className = "ct_desc cleared" Тогда новСтр = Товары.Добавить(); Для Каждого опСтр из Стр.children Цикл Если опСтр.className = "pic_and_comp" Тогда новСтр.Картинка = СтрЗаменить(Сред(опСтр.firstChild.style.backgroundImage,5),")","") КонецЕсли; Если опСтр.className = "name" Тогда новСтр.Наименование = опСтр.innerText; новСтр.Ссылка = опСтр.firstChild.href; КонецЕсли; Если опСтр.className = "price" Тогда новСтр.Цена = Число(СтрЗаменить(СтрЗаменить(опСтр.innerText,"-","")," ","")); КонецЕсли; Если опСтр.className = "desc" Тогда новСтр.Описание = опСтр.innerText;//опСтр.innerHTML - если нужно вместе с тегами
КонецЕсли; КонецЦикла;
КонецЕсли;
КонецЦикла; Закрыть(); КонецПроцедуры
10. Проверям. Все работает.
Дело осталось за "операционной системой" и еще надо загрузить картинки. Давайте по порядку. Чтобы получить "ОС" нам надо открыть этот товар и считать "ОС" оттуда. Для этого делаем следующее:
1. Добавляем на нижней панели кнопку "Доп Инфо" с кодом:
Для Каждого Стр из Товары Цикл Форма = ПолучитьФорму("ФормаДопИнфо"); Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка); Форма.ТекущийТовар = Стр; Форма.ОткрытьМодально(); КонецЦикла;
2. Создаем форму обработки "ФормаДопИнфо" 3. Кладем на "ФормаДопИнфо" ПолеHTMLДокумента и называем его "Сайт" 4. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:
Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда ГрузимДопИнфо(); КонецЕсли;
5. Создаем переменную в модуле формы перем ТекущийТовар Экспорт; 6. Создаем процедуру ГрузимДопИнфо():
Процедура ГрузимДопИнфо(); Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл Если Стр.className = "card_spec" Тогда Для Каждого опСтр из Стр.children Цикл Если Найти(опСтр.innerText,"Операционная система:") Тогда ТекущийТовар.ОС = СокрЛП(СтрЗаменить(опСтр.innerText,"Операционная система:","")); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Закрыть(); КонецПроцедуры
7. Проверяем и переходим к последнему пункту
Заметили как похожи две последние инструкции? То-то же. Стремился к универсальности. Ну и наконец последний этап - Сохраним все изображения к примеру на диск "С" в папку "связной". Поехали
1. Добавляем на нижней панели кнопку "Сохранить Картинки" с кодом:
Для Каждого Стр из Товары Цикл путьСамФайл = Лев(Стр.Картинка,Найти(Стр.Картинка,".jpg/") + 3); самФайл = СтрЗаменить(СтрЗаменить(ПутьСамФайл,"http://static.svyaznoy.ru/upload/iblock/",""),"/",""); Стр.Картинка = СохранитьКартинкуСайта("C:\Svyaznoy",ПутьСамФайл,СамФайл); КонецЦикла;
На этом наша эпопея с парсингом закончена. Это всего лишь пример того, как это можно сделать. Приложив сюда немного своего кода - можно сделать парсер для любого сайта.
Имя парсер 1С - я могу спарсить все, кроме этого парсера. Имя два парсера 1С - я могу спарсить все
Один из пороков программ - забывчивость. Пользователь настраивал настраивал под себя интерфейс, закрыл форму, открыл и вуаля... настраивай все заново. Так можно и монитор сломать. Проблему усугубляет отсутствие стандартного механизма сохранения/восстановления настроек динамических списков. Под катом решение проблемы.
Основные моменты и предпосылки:
1) Преобразуем настройки списков так, чтобы их можно было сохранять
2) в 95% случаев при открытии формы нам нужно, чтобы восстановилось последнее состояние формы, а не по умолчанию или список выбора сохраненной настройки(которую еще и сохранить до этого нужно было)
3) Списки в основном учавствуют в формах списка и выбора, где нет других полей к сохранению, поэтому к стандартному механизму с методами ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере больно то не подрубишся
После небольшой работы мозгами получилось следующее:
// Группировки Функция СериализоватьГруппировки(пГруппировки)
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Группировки"); Для Каждого цЭлементГруппировки Из пГруппировки.Элементы Цикл СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементГруппировки); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); Возврат ЗаписьXML.Закрыть();
пГруппировка.Элементы.Очистить(); Если пНастройки_Группировка <> Неопределено Тогда ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(пНастройки_Группировка); ЧтениеXML.ПерейтиКСодержимому(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Группировки" Тогда ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Группировки" Цикл ПолеГруппировкиXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПолеГруппировки = пГруппировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(ПолеГруппировки, ПолеГруппировкиXML); КонецЦикла; КонецЕсли; КонецЕсли;
КонецПроцедуры // ДесериализоватьГруппировки()
// Порядок
Функция СериализоватьПорядок(пПорядок)
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Порядок"); Для Каждого цЭлементПорядка Из пПорядок.Элементы Цикл СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементПорядка); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьПорядок()
Функция ДесериализоватьПорядок(пНастройки_Порядок, пПорядок)
пПорядок.Элементы.Очистить(); Если пНастройки_Порядок <> Неопределено Тогда ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(пНастройки_Порядок); ЧтениеXML.ПерейтиКСодержимому(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Порядок" Тогда ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Порядок" Цикл ПолеПорядкаXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПолеПорядка = пПорядок.Элементы.Добавить(ТипЗнч(ПолеПорядкаXML)); ЗаполнитьЗначенияСвойств(ПолеПорядка, ПолеПорядкаXML); КонецЦикла; КонецЕсли; КонецЕсли;
КонецФункции // ДесериализоватьПорядок()
// Отборы
Функция СериализоватьОтбор(пОтбор)
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Отборы"); Для Каждого цЭлементОтбора Из пОтбор.Элементы Цикл СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементОтбора); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); Возврат ЗаписьXML.Закрыть();
пОтбор.Элементы.Очистить(); Если пНастройки_Отбор <> Неопределено Тогда ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(пНастройки_Отбор); ЧтениеXML.ПерейтиКСодержимому(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Отборы" Тогда ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Отборы" Цикл ПолеОтбораXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПолеОтбора = пОтбор.Элементы.Добавить(ТипЗнч(ПолеОтбораXML)); СкопироватьЭлементыОтбораРекурсивно(ПолеОтбораXML, ПолеОтбора); //ПолеОтбора.Поле = ПолеОтбораXML.Поле; КонецЦикла; КонецЕсли; КонецЕсли;
ЗаполнитьЗначенияСвойств(пОтборКуда, пОтборОткуда); Если ТипЗнч(пОтборОткуда) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда Для Каждого ЭлементОтбора Из пОтборОткуда.Элементы Цикл НовыйЭлементОтбора = пОтборКуда.Элементы.Добавить(ТипЗнч(ЭлементОтбора)); СкопироватьЭлементыОтбораРекурсивно(ЭлементОтбора, НовыйЭлементОтбора); КонецЦикла; КонецЕсли;
Функция СериализоватьУсловноеОформление(пУсловноеОформление)
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("УсловноеОформление"); Для Каждого цЭлементУсловногоОформления Из пУсловноеОформление.Элементы Цикл СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементУсловногоОформления); КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьУсловноеОформление()
Функция ДесериализоватьУсловноеОформление(пНастройки_УсловноеОформление, пУсловноеОформление)
пУсловноеОформление.Элементы.Очистить(); Если пНастройки_УсловноеОформление <> Неопределено Тогда ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(пНастройки_УсловноеОформление); ЧтениеXML.ПерейтиКСодержимому(); Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "УсловноеОформление" Тогда ЧтениеXML.Прочитать(); Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "УсловноеОформление" Цикл ПолеУсловногоОформленияXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПолеУсловногоОформления = пУсловноеОформление.Элементы.Добавить(); ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления, ПолеУсловногоОформленияXML); Для Индекс = 0 по ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы.Количество()-1 Цикл ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления.Оформление.ДоступныеПараметры.Элементы[Индекс], ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы[Индекс]); КонецЦикла; Для Индекс = 0 по ПолеУсловногоОформленияXML.Оформление.Элементы.Количество()-1 Цикл ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления.Оформление.Элементы[Индекс], ПолеУсловногоОформленияXML.Оформление.Элементы[Индекс]); КонецЦикла; Для каждого ЭлементОтбораXML ИЗ ПолеУсловногоОформленияXML.Отбор.Элементы Цикл ЭлементОтбора = ПолеУсловногоОформления.Отбор.Элементы.Добавить(ТипЗнч(ЭлементОтбораXML)); СкопироватьЭлементыОтбораРекурсивно(ЭлементОтбораXML, ЭлементОтбора); КонецЦикла; Для каждого ПолеXML ИЗ ПолеУсловногоОформленияXML.Поля.Элементы Цикл Поле = ПолеУсловногоОформления.Поля.Элементы.Добавить(); ЗаполнитьЗначенияСвойств(Поле, ПолеXML); КонецЦикла; КонецЦикла; КонецЕсли; КонецЕсли;
Подручный, бесплатный инструмент для программиста, с руками, растущими "откуда нужно".
Итак, у вас имеется НЛО: полученный Невесть Откуда ХМЛ-файл произвольной структуры, и кто-то злой требует, чтобы он превратился (и всякий раз превращался) в документ (кучу документов) в некоторой конфигурации 1С.
Предлагаемый загрузчик позволяет решить эту задачу, а именно:
1. Проанализировать структуру xml-файла 2. Создать правила сопоставления с объектами конфигурации 3. Выполнить загрузку и сформировать документы в базе 4. Выполнить автоматическую постобработки загруженных данных (заполнение каких-то полей, расчет суммы документа и т.д., все то, что предполагается в конфигурации при создании загружаемого документа)
За основу был взят мой xml-парсер, но большую часть проекта выполнила ведущий специалист ООО "О-Планет" Маша Желонкина. (сам ф шоке!)
Особенность женской логики проявилась в немного сложноватом (для ума мужчины) интерфейсе и наличие двух пояснительных файлов, названных "Описание" и "Инструкция". В остальном работа, на мой взгляд, замечательная.
Хоть работа и коммерческая, но выкладываем для свободного скачивания и использования программистами в их нелегком труде. Коллеги - выссказывайтесь!
Скачать (пароль в правилах раздела): [attachment=422:parser.zip]
Просмотр и редактирование hbk-файлов - справочной информации 1с, в том числе и синтакс-помощника. Реализовано на управляемых формах, но ничего не мешает переделать под толстого клиента.
Обработка представляет из себя что-то вроде синтакс-помощника, но с возможностью редактирования: можно перемещать/удалять строки, можно добавлять свою иерархию со своими html-файлами и шаблонами по подстановке в текст модуля. Алгоритм работы примерно следующий:
Читаем файл hbk (shcntx_ru.hbk - основная часть синтакс-помощника, например).
При этом в каталоге временных файлов создается каталог shcntx_ru (имя выбранного файла), где будет происходить вся дальнейшая работа.
Редактируем иерархию файла: перемещаем строки, перетаскиванием изменяем иерархию, удаляем, создаем новые и т.д. Существует три вида строк, насколько я понял: папка с описанием, папка и раздел. Все эти виды строк помечаются соответствующей пиктрограммой.
Редактирование html-файлов пока возможно только сторонними редакторами, открываем нужный html-файл в .\shcntx_ru\FileStorage, редактируем, потом в обработке выбираем этот файл и жмем "Записать HTML=файл". Или создаем новый (обязательно в .\shcntx_ru\FileStorage), указываем в обработке к нему путь и опять же записываем.
Редактирование файла st происходит непосредственно в обработке, простейший пример можно глянуть либо в уже существующих разделах, либо нажав на кнопку "Установить стандартный шаблон". После редактирования надо нажать на кнопку "Записать st-файл".
После редактирования (разделов, html-файлов, st-файлов) необходимо нажать на кнопку "Собрать файл", после чего в рабочем каталоге (каталог временных файлов плюс имя файла-hbk) будет создан новый файл hbk.
Далее либо руками копируем его в каталог bin, либо жмем в обработке "Все действия/Заменить исходный файл". Эта команда может не выполниться, если в конфигураторе уже был открыт синтакс-помощник или соответствующий файл справки. Если все нормально, получаем сообщение "Файл успешно скопирован".
В рабочем каталоге всегда сохраняется оригинальный файл с именем "original.hbk", в любой момент командой "Все действия/Восстановить исходный файл" можно вернуть оригинал на место, либо командной "Все действия/Прочитать исходный файл" прочитать оригинальный файл.
Известные недостатки:
Добавленные строки не ищутся в индексе. Структура индекса уже разобрана, но вот записи пока еще нет, ожидается чуть позднее.
Добавленные файлы не ищутся в полнотекстовом поиске. Вот тут пока вообще не очень ясно, полнотекстовый поиск не хранится в hbk-файле, кажется.
Поскольку файл синтакс-помощника состоит из двух файлов (shcntx_ru.hbk и shlang_ru.hbk), то не всегда получается четко управлять порядком строк, видно на картинке "Результат работы".
Благодарности:
Огромное спасибо создателям zip.exe, unzip.exe и V8Unpack.exe, без этих программ гораздо труднее было бы распаковать hbk-файл. Также спасибо TormozIT за файл стилей синтакс-помощника.
P.S. Редактировать можно, разумеется, не только синтакс-помощник, но и справку, которая отображается по F1 в конфигураторе и предприятии. О любых ошибках, замечаниях и предложениях просьба писать в комментарии, возможно, я буду развивать обработку. Текст открытый, так что при желании можете и сами
После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было решено использовать геокодирование сервиса Google и Google Visualization для отображение элементов на карте.
Геокодирование – процесс преобразования адресов·(Украина, Киевская область, Киев, Крещатик 20) в географические координаты (широта 37.423021 и долгота -122.083739), которые можно использовать для размещения маркеров или расположения карты. Подробно про геокодирование можно почитать тут.
Для работы с геокодированием необходимо зарегистрировать ключ API карт Google. В демонстрационной конфигурации его надо прописать в константу КлючКарта.
Важный момент: если у вас программа работает в локальной сети и в Internet, то вам необходимо регистрировать два ключа. В зависимости от того, с какого места подключается пользователь к базе подставлять тот или иной ключ.
И так, собственно программная реализация.
В конфигурации есть две общих формы:
Форма подбора координат. Данная форма формирует запрос на геокодирование и обрабатывает результат.
Форма отображения объектов. Данная форма использует API визуализации Google. В частности данная форма использует визуализацию Map.
Запрос и обработка результата геокодирования.
Формирование запроса происходит с ключом output=csv, для вывода результата запроса в csv файл. После выполнения запроса проверяется код результата запроса и разбор csv файла на широту и долготу.
#НаСервере Процедура ОтправитьЗапросНаПоискКоординат() Город = Параметры.ОбъектПодбора.Город.Наименование; Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование; Адрес = Параметры.ОбъектПодбора.Адрес; ПараметрПоиска = Страна + " " + Город + " " + Адрес;
Попытка HTTPСервис.Получить(ТекстСсылки, АдресOutput); Исключение Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное); ПравильностьВыполнения = Ложь; КонецПопытки;
Если ПравильностьВыполнения Тогда // Распарсить результат ответа поиска Текст = Новый ТекстовыйДокумент; Текст.Прочитать(АдресOutput); РезультатПоиска = Текст.ПолучитьСтроку(1);
ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений; ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка")); ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка")); ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка")); ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6))); ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6))); Если Параметры.ОтображатьСОтветственными Тогда ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка")); КонецЕсли;
Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения); Если КоординатыОбъекта = Неопределено Тогда Продолжить; Иначе НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить(); НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование; НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование; НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес; НоваяСтрока.Широта = КоординатыОбъекта[0]; НоваяСтрока.Долгота = КоординатыОбъекта[1]; Если Параметры.ОтображатьСОтветственными Тогда НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование; КонецЕсли; КонецЕсли; КонецЦикла;
Да я не знаю даже, тем более, что у вас даже вкладки дополнительно нету. Это надо брать именно вашу базу и на ней уже смотреть почему требуется заполнение этого поля и где его можно заполнить.
У вас есть отличная возможность разыграть коллегу по работе или друзей. Все что потребуется - это купюра любого наминала, самое главное, чтоб вам ее не было жалко. А дальше следуйте инструкции приведенной ниже.
Для 8.2 немного по другому. HEX-редактором ищем имя users.usr. Затем, как пишет автор статьи ссылка на которую выше:
Цитата
«Мы находим строку вида 00 00 2D 00 00 00 00 09 00 75 00 73 00 65 00 72 00 Для взлома паролей 1С надо изменить байт соседний с 09, так чтобы получилось 00 00 2D 00 00 000109 00 75 00 73 00 65 00 72 00?
Затем аналогично находим имя v8users (В параметрах поиска в WinHex уберите галку Match Case (Учитывать регистр) и поиск делай по «users») . Здесь переименовываем первую букву имени, так чтобы получилось примерно так: H8users.
Выбираем шрифт, цвет текста, цвет фона и получаем любой текст в виде картинки. Нажатием "трёх кнопок" можно сделать открытку или нанести на картинку водяной знак в виде текста
Вот получил задание: Разослать по электронной почте фирменные открытки с личным обращением к получателю. И вновь меня спас ImageMagick. В качестве примера работы с текстом в этом консольном графическом редакторе выкладываю обработку ГенераторНадписей.epf. Для запуска обработки под 8.2, обработку необходимо открыть в конфигураторе для конвертации.
Генератор надписей позволяет сформировать текст в виде картинки или наложить текст на картинку. Всё что нужно сделать - это выбирать шрифт, цвет текста, цвет фона и можно получить любую надпись с альфа-каналом или разместить надпись на картинке. Результат наложения текста выводится на рабочий стол со скролингом. Так что можно поиграться и выбрать наилучшее сочетание шрифта, цветов или размещения текста и тени.
200 русифицированных шрифтов прилагается.
Есть возможность групповой обработки файлов - для этого нужно выбрать режим работы "Результат каталог слайдов (24-bit)".
Попробуйте. Надеюсь, вам понравится
Сами внешние компоненты находятся в макетах обработки.
Скачать (пароль в правилах раздела): [attachment=430:generatornadpisej.zip]
Во многих языках программирования есть такая фича - во время отладки "на лету" можно поменять значение переменной. В 1С почему-то не предусмотрено в штатном режиме. Это легко обойти
А заключается она в следующем. Есть такой замечательный оператор - Выполнить().
Создаём обработку, в которой пишем экспортную функцию, которая возвращает нам что-то (на самом деле неважно что):
В результате в окне сообщения у нас появится "3" вместо "4".
Для удобства можно эту функцию написать в модуле приложения.
У этой фичи есть еще одна полезная штука - можно прерывать выполнение каких-нибудь зациклившихся веток кода или просто какой-нибудь огромный цикл без перезапуска отладки. Для этого нужно присвоить какой-нибудь переменной некорректное значение. Например, агрегатный объект заменить на число или строку. Тогда при обращении к полю агрегатного объекта 1Ска вывалится с сообщением об ошибке.
Данная статья предоставлена здесь исключительно в демонстрационных целях!
Взлом паролей в 1С 8 делается сложнее. Нижеописанный способ подходит только для файловой версии 1С предприятия.
Итак для взлома нам понадобится любой HEX – редактор, но лучше чтобы он поддерживал большие по объему файлы, так как нам придется править большой по объему файл. Я использую HEX – редактор WinHex.
Итак после установки WinHex открываем в нем файл 1Cv8.1CD, который находится в папке информационной базы.
Открываем файл 1Cv8.1CD
Затем нам необходимо найти последовательность отпределенных байт для этого ищем в формате юникод строку users.usr. Для этого меню Поиск – Поиск текста. Выбираем кодировку юникод и ищем.
Для взлома паролей 1С надо изменить байт соседний с 09, так чтобы получилось
00 00 2D 00 00 000109 00 75 00 73 00 65 00 72 00
Правим строку в winHex для взлома паролей 1с
Как только исправили 0 на 1 нажимаем сохранить и входим в конфигуратор без паролей, не закрывая WinHex
Открываем Администрирование – Пользователи.
Список пользователей пуст.
Далее в WinHex меняем значение назад как было и сохраняемся, не закрывая конфигуратор 1С.
Далее можно добавть нового пользователя или обновить список пользователей – все пользователи должны появиться и теперь мы можем делать с ним все что угодно, например удалить, снять пароль или изменить пароль. Сохраняем список пользователей и можно входить в 1С.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!