Часто используемые программы
Хочу поделиться с вами, вспомогательными программами, которые использую в работе и повседневной жизни, надеюсь вы найдете, что нибудь полезное для себя.
Подробнее »Часто используемые программы
Хочу поделиться с вами, вспомогательными программами, которые использую в работе и повседневной жизни, надеюсь вы найдете, что нибудь полезное для себя.
Подробнее »Часто используемые программы
Global Russian Virtual Group Microsoft SQL Server
Рекомендую к просмотру youtube канал «russianVC», много крайне полезной информации по работе и оптимизации Microsoft SQL Server, в удобном видео формате.
В особенности, полезным для разработчиков 1С, буду следующие видеоматериалы:
Описание: Вне зависимости от характеристик сервера, система никогда не будет работать с достаточной производительностью в случае, если база данных плохо проиндексирована. Но что является хорошей и правильной индексацией? Специалисты, работающие с базами данных, часто употребляют такие термины как «Схема индексации» и «Оптимизация» придавая излишнюю сложность вопросу. Однако для оптимальной индексации данных достаточно лишь понимать как SQL Server работает с индексами изнутри. Базовые принципы не меняются и могут быть применены в любой системе.
Наглядная и доступная информация по работе Microsoft SQL Server.
Основными источниками информации, для подготовки являются:
Курсы:
Сайты для подготовки к «Тестирование 1С:Профессионал по технологическим вопросам»:
Обновление от 10.12.2018:
Материал из Википедии — свободной энциклопедии:
Персональный информационный менеджер, ПИМ (англ. Personal Information Manager, PIM) — компьютерная программа, служащая для облегчения работы с разного рода личной информацией. В простейшем случае это программа, выполняющая функции персонального органайзера. Более сложные программы имеют дополнительные функции, позволяющие вести совместное планирование и организовывать совместную работу над проектами (Groupware).
В свое время, озадачился хранением разнородной информации консолидировано, было перепробовано много различных программ от простых wiki систем до облачных решений, но все так или иначе имели свои недостатки и ограничения. Некоторые не позволяли оформлять текст, добавлять большие файлы или имели не удобную структуру и зависели от подключения к интернету.
Оптимальное решение было найдено, программа EssentialPIM — в бесплатной версии имеется весь необходимый функционал, при том что использую лишь опцию «Заметки». Данные хранятся в локальном файле с расширением «.epim», который легко можно синхронизировать с другими компьютерами при помощи того же Яндекс.Диск или Google Drive. При помощи тех же сервисов можно хранить файлы, ссылки на которые добавлять в текст заметки, при этом нас ограничивают лишь размеры жесткого диска и если необходима синхронизация, то размер «облака».
Пример, как выглядит домашняя база, в которой не особо много данных:
Сама по себе программа имеет обширный функционал, который в последующем так же можно использовать в повседневной работе. Особенности программы: Сегодня — Полный обзор предстоящих дел в простом и понятном виде. Здесь собраны данные со всех модулей, которые дают обзор ближайших и будущих дел. Календарь — Красочные, легкие для чтения и понимания дневной, недельный, месячный и годовой виды. Дела — Гибкое структурирование дел с использованием иерархии и закладок. Возможность фильтрации данных. Заметки — Плоская или иерархическая структура заметок. Или их комбинация. Контакты — Многоуровневость групп и мощные фильтры гарантируют легкое нахождение контакта. Почта — Переносная версия для USB-флешки, способная работать как в онлайн так и оффлайн режиме. Пароли — Удобный способ хранить все ваши пароли и другую конфиденциальную информацию. Корзина — Гарантирует сохранность ваших данных от случайного удаления.
Часть 0: Разработка мобильных приложений 1С – Быстрый старт!
Часть 1: Разработка мобильных приложений 1С — Аутентификация пользователя.
Часть 3: Разработка мобильных приложений 1С — Обмен данными.
В этой небольшой статье, которая является началом цикла «Разработка мобильных приложений 1С», покажу, как можно быстро создать 1С мобильное приложение «Привет мир», на основе мобильной платформы 1С.
Для тестирования готового мобильного приложения 1С, будет использоваться реальное устройство на основе операционной системы Android, с использованием мобильной платформы для разработчиков и возможности отладки по протоколу HTTP.
Подробнее »Разработка мобильных приложений 1С
Делюсь реализацией задачи о начислении амортизации основного средства в пределах периода срока полезного использования. Необходимо доработать типовой функционал конфигурации «Управление производственным предприятием», редакция 1.3, для того чтобы, при проведении документа «Амортизация ОС», анализировался срок полезного использования основного средства и производилось начисление амортизации в рамках срока полезного использования. Так как, иногда возникали ситуации, когда срок полезного использования завершен, а начисление производилось в последующие месяцы и обычно это были не большие суммы.
Схематично ситуацию можно представить следующим образом:
Доработка реализована для управленческого, бухгалтерского и налогового учета, основных средств, использующих линейных метод начисления.
При анализе кода проведения документа «Амортизация ОС», основные расчеты суммы начисления амортизации, производятся в общем модуле «УправлениеВнеоборотнымиАктивами», в соответствующих функциях: «РасчетАмортизацииУпр», «РасчетАмортизацииБухРегл» и «РасчетАмортизацииНалогРегл». Указанные функции по своей структуре схожи и имеют в своем составе основной запрос и последующий расчет начисления суммы амортизации.
Подробнее »Начисление амортизации в рамках срока полезного использования
В данной небольшой заметке хочу показать, как можно произвести суммирование значений на различных уровнях группировки, в отчете с использованием системы компоновки данными.
Как показано на изображении, только на уровне группировки «Группы номенклатуры», рассчитывается ресурс «Заказать», в нем отображается, сколько нужно заказать по текущей группе номенклатуры исходя из определенных условий:
Данное значение может быть рассчитано только на данном уровне группировки, так как, выше или ниже, отсутствуют значения для расчета. Например, на уровне детальных записей, нет данных по максимальному количеству в группе, потому что эти данные верны только для группы в целом, а не для отдельных ее составляющих.
Соответственно, теперь необходимо рассчитать итоги, по выше находящимся группировкам («Склады», «ТипыСкладов») и общий итог.
Для этого используется функция ВычислитьВыражениеСГруппировкойМассив:
ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ (EVALEXPRESSIONWITHGROUPARRAY)
Синтаксис:
ВычислитьВыражениеСГруппировкойМассив(<Выражение>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>)
Описание:
Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.
Компоновщик макета при генерации макета преобразовывает параметры функции в термины полей макета компоновки данных. Например, поле Контрагент будет преобразовано в НаборДанных.Контрагент.
Компоновщик макета при генерации выражений для вывода пользовательского поля, в выражении которого присутствует только функцияВычислитьМассивСГруппировкойМассив(), генерирует выводимое выражение таким образом, чтобы выводимая информация была упорядочена. Например, для пользовательского поля с выражением:
ВычислитьВыражениеСГруппировкойМассив(«Сумма(СуммаОборот)», «Контрагент»)
Компоновщик макета сгенерирует для вывода следующее выражение:
СоединитьСтроки(Массив(Упорядочить(ВычислитьВыражениеСГруппировкойТаблицаЗначений(«Представление(Сумма(НаборДанных.СуммаОборот)),Сумма(НаборДанных.СуммаОборот)»,»НаборДанных.Контрагент»),»2″)))
Параметры:
<Выражение>
Тип: Строка. Выражение, которое нужно вычислить. Строка, например, Сумма(СуммаОборот).
<ВыражениеПолейГруппировки>
Тип: Строка. Выражения полей группировки – выражения полей группировки, перечисленные через запятую. Например, Контрагент, Партия.
<ОтборЗаписей>
Тип: Строка. Выражение, описывающее отбор, применяемый к детальным записям. В выражении не поддерживается использование агрегатных функций. Например,ПометкаУдаления = Ложь.
<ОтборГруппировок>
Тип: Строка. Выражение, описывающее отбор, применяемый к групповым записям. Например, Сумма(СуммаОборот) > &Параметр1.
Пример:
Максимум(ВычислитьВыражениеСГруппировкойМассив («Сумма(СуммаОборот)», «Контрагент»));
Подробное описание синтаксиса функции можно найти по адресу http://its.1c.ru/db/v837doc#bookmark:dev:TI000000582
Теперь для расчета, продублируем поле «Заказать», с различными значениями «Рассчитывать по…», используя следующие выражения, обратите внимание, что в каждом выше стоящем уровне используются значения уровней ниже стоящих группировок.
В итоге получаем следующую конструкцию:
Предполагаю, что есть и другой способ расчета значений, на различных уровнях группировок в системе компоновки данными, при указанных условиях, если у вас есть данная информация, оставьте комментарий к данной заметке и она будет дополнена.
В данном примере будет показано, как осуществить программное добавление полей и ресурсов в СКД отчет, а так же, как передать таблицу значений в качества источника данных. Для примера реализации программного добавления полей в систему компоновки данных, будет использоваться таблица значений с неизвестным количеством колонок, которые нужно вывести в отчет СКД.
Для начала необходимо создать внешний отчет, в модуле объекта которого добавить процедуру ПриКомпоновкеРезультата:
В указанную процедуру добавим следующий код, в комментариях, описаны основные действия, сначала создается таблица значений со случайным количеством колонок, далее колонки, поля, ресурсы, программно добавляются в систему компоновки данными и передаются как внешний набор данных:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; //Структура внешних данных, для передачи в СКД ВнешниеНаборыДанных = Новый Структура; тзДанные = Новый ТаблицаЗначений; тзДанные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); тзДанные.Колонки.Добавить("УникальноеНаименование", Новый ОписаниеТипов("Строка")); //С помощью генератора случайных чисел определяем количество колонок ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(); СлучайноеЧисло = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 10); //Формируем колонки Для Индекс = 1 По СлучайноеЧисло Цикл тзДанные.Колонки.Добавить("Колонка" + Индекс, Новый ОписаниеТипов("Число")); КонецЦикла; //Заполняем таблицу значений данными Для Индекс = 1 По 10 Цикл СтрокаТз = тзДанные.Добавить(); СтрокаТз.Наименование = "Начальная группировка"; СтрокаТз.УникальноеНаименование = Новый УникальныйИдентификатор; Для Счетчик = 1 По СлучайноеЧисло Цикл ИмяКолонки = "Колонка" + Счетчик; СтрокаТз[ИмяКолонки] = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, 10); КонецЦикла; КонецЦикла; //Сохраняем таблицу значений в наборе внешних данных ВнешниеНаборыДанных.Вставить("тзДанные", тзДанные); //Получаем схему из макета СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); //Из схемы возьмем настройки Настройки = КомпоновщикНастроек.ПолучитьНастройки(); //Программно добавляем поля и ресурсы Для Индекс = 1 По СлучайноеЧисло Цикл Поле = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); Поле.Заголовок = "Колонка" + Индекс; Поле.ПутьКДанным = "Колонка" + Индекс; Поле.Поле = "Колонка" + Индекс; Поле.ТипЗначения = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2)); ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); ПолеРесурса.Выражение = "СУММА(Колонка" + Индекс + ")"; ПолеРесурса.ПутьКДанным = "Колонка" + Индекс; ПолеРесурса.Группировки.Добавить("Наименование"); ПолеРесурса.Группировки.Добавить("УникальноеНаименование"); ПолеРесурса.Группировки.Добавить("ОбщийИтог"); КонецЦикла; //Добавляем в выбранные поля Для Индекс = 1 По СлучайноеЧисло Цикл ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Заголовок = "Колонка" + Индекс; ВыбранноеПоле.Использование = Истина; ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Колонка" + Индекс); КонецЦикла; //Помещаем в переменную данные о расшифровке данных ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; //Формируем макет, с помощью компоновщика макета КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; //Передаем в макет компоновки схему, настройки и данные расшифровки МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); //Выполним компоновку с помощью процессора компоновки ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; //Передаем внешний набор данных ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки); //Очищаем поле табличного документа ДокументРезультат.Очистить(); //Выводим результат в табличный документ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры
После необходимо создать основную схему компоновки данных, как показано на изображении:
С простой настройкой группировки:
Сохранить внешний отчет и запустить в режиме 1С:Предприятие, несколько раз сформировать отчет, благодаря генератору случайных чисел, количество колонок практически всегда будет разным:
Тем самым было продемонстрировано, как программно добавить поле в систему компоновки данных.
Скачать рассмотренный в статье пример: ПрограммноеДобавлениеПолей
Изредка, в работе программистов и системных администраторов, возникают ситуации и задачи, когда необходимо произвести интеграцию 1С и Active Directory. В данном примере будет показано как с помощью технологии LDAP (англ. Lightweight Directory Access Protocol — «облегчённый протокол доступа к каталогам») и средств интеграции 1С, получить данные из Active Directory. Интеграция 1С и Active Directory может использоваться не только для получения данных, но и для создания объектов в структуре соответствующего домена.
В процессе создания алгоритма интеграции 1С и Active Directory, будет весьма полезна программа «Active Directory Explorer», создателем который является известный программист и писатель Марк Русси́нович. Данная программа позволит вам просмотреть дерево объектов выбранного вами домена, а если в начале запуска программы, сразу нажать кнопку «ОК», то домена по умолчанию, для текущего компьютера.
Далее приведен код процедуры, с помощью которого можно получить список групп домена, в определенном организационном блоке (OU):
&НаКлиенте Процедура ПолучитьГруппыДомена() КомандаАДО = Новый COMОбъект("ADODB.Command"); СоединениеАДО = Новый COMОбъект("ADODB.Connection"); СоединениеАДО.Provider = "ADSDSOObject"; Попытка СоединениеАДО.Open("Active Directory Provider"); Исключение Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки()); Возврат; КонецПопытки; КомандаАДО.ActiveConnection = СоединениеАДО; //Получаем имя домена к которому принадлежит данный компьютер Попытка RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE"); Исключение Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки()); Возврат; КонецПопытки; ТекущийДомен = RootDSE.Get("defaultNamingContext"); Сообщить("ТекущийДомен: " + ТекущийДомен); //Подключаемся к текущему домену Попытка ОбъектТекущегоДомена = ПолучитьCOMОбъект("LDAP://" + ТекущийДомен); Исключение Сообщить("Ошибка ПолучитьCOMОбъект "+"LDAP://" + ТекущийДомен+": " + ОписаниеОшибки()); Возврат; КонецПопытки; ИмяДомена = ОбъектТекущегоДомена.dc; Сообщить("ИмяДомена: " + ИмяДомена); //Формируем команду получения групп из блока Groups КомандаАДО.CommandText = "<LDAP://OU=Groups," + ТекущийДомен + ">" + ";(&(objectClass=top)(objectClass=organizationalUnit));name;onelevel"; КомандаАДО.Properties("Page Size").Value = 100; КомандаАДО.Properties("Timeout").Value = 30; КомандаАДО.Properties("Cache Results").Value = Ложь; Попытка ВыборкаАДО = КомандаАДО.Execute(); Исключение Сообщить("Ошибка Execute(): " + ОписаниеОшибки()); Возврат; КонецПопытки; //Выводим список групп Пока НЕ ВыборкаАДО.EOF Цикл Сообщить("Группа домена: " + ВыборкаАДО.Fields("name").Value); ВыборкаАДО.MoveNext(); КонецЦикла; //Обязательно закрываем соединения и объекты ВыборкаАДО.Close(); СоединениеАДО.Close(); КонецПроцедуры
Теперь получаем данные пользователей, которые включены в выбранную группу домена:
&НаКлиенте Процедура ПолучитьПользователейГруппы() КомандаАДО = Новый COMОбъект("ADODB.Command"); СоединениеАДО = Новый COMОбъект("ADODB.Connection"); СоединениеАДО.Provider = "ADSDSOObject"; Попытка СоединениеАДО.Open("Active Directory Provider"); Исключение Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки()); Возврат; КонецПопытки; КомандаАДО.ActiveConnection = СоединениеАДО; Попытка RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE"); Исключение Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки()); Возврат; КонецПопытки; ТекущийДомен = RootDSE.Get("defaultNamingContext"); Сообщить("ТекущийДомен: " + ТекущийДомен); Попытка ОбъектТекущегоДомена = ПолучитьCOMОбъект("LDAP://" + ТекущийДомен); Исключение Сообщить("Ошибка ПолучитьCOMОбъект "+"LDAP://" + Объект.ТекущийДомен+": " + ОписаниеОшибки()); Возврат; КонецПопытки; ИмяДомена = ОбъектТекущегоДомена.dc; Сообщить("ИмяДомена: " + ИмяДомена); КомандаАДО.CommandText = "<LDAP://OU=" + ГруппыДомена + ",OU=Groups," + Объект.ТекущийДомен + ">" + ";(&(objectCategory=person)(objectClass=user));sAMAccountName,userAccountControl,displayName,department,mail,telephoneNumber;onelevel"; КомандаАДО.Properties("Page Size").Value = 100; КомандаАДО.Properties("Timeout").Value = 30; КомандаАДО.Properties("Cache Results").Value = Ложь; Попытка ВыборкаАДО = КомандаАДО.Execute(); Исключение Сообщить("Ошибка Execute(): " + ОписаниеОшибки()); Возврат; КонецПопытки; Пока НЕ ВыборкаАДО.EOF Цикл ПользовательДомена = Новый Структура; Если ВыборкаАДО.Fields("userAccountControl").Value = 514 ИЛИ ВыборкаАДО.Fields("userAccountControl").Value = 546 ИЛИ ВыборкаАДО.Fields("userAccountControl").Value = 66050 Тогда Сообщить("Заблокирован"); Иначе Сообщить("НеЗаблокирован"); КонецЕсли; Сообщить("ИмяПользователя " + СокрЛП(ВыборкаАДО.Fields("displayName").Value)); Сообщить("ИмяАккаунта " + СокрЛП(ВыборкаАДО.Fields("sAMAccountName").Value)); Сообщить("Подразделение " + СокрЛП(ВыборкаАДО.Fields("department").Value)); Сообщить("Почта " + СокрЛП(ВыборкаАДО.Fields("mail").Value)); Сообщить("Телефон " + СокрЛП(ВыборкаАДО.Fields("telephoneNumber").Value)); ВыборкаАДО.MoveNext(); КонецЦикла; ВыборкаАДО.Close(); СоединениеАДО.Close(); КонецПроцедуры
По этому примеру можно создавать более сложные примеры интеграции 1С и Active Directory, более подробные сведения, вы можете получить по следующим адресам:
ADSI LDAP Provider
Использование протокола LDAP в скриптах
В предыдущей заметке «Использование шаблонов Word в 1С» был показан простой способ, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных. В текущей заметке «1с word шаблон» будет показан один из способов, как можно реализовать заполнение таблиц в шаблоне Word.
Для примера использовался шаблон Word следующего вида:
Как видно из шаблона, закладка «Таблица1» является указателем на начало таблицы и служит для позиционирования выделения.
Теперь непосредственно сам способ, для его реализации использовалась внешняя обработка, в модуле формы которой, описана лишь одна процедура «ПриОткрытии(Отказ)»:
&НаКлиенте Процедура ПриОткрытии(Отказ) //Попытка создать COM объект Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; //Путь к шаблону ОбъектВорд.Documents.Add("C:\Users\Константин\Desktop\Шаблон.docx"); ШаблонВорд = ОбъектВорд.ActiveDocument; //Заполняем первую таблицу Если ШаблонВорд.Bookmarks.Exists("Таблица1") Тогда //Выделяем обязательную закладку начала таблицы ШаблонВорд.Bookmarks("Таблица1").Select(); //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена ШаблонВорд.Application.Selection.MoveDown(); ШаблонВорд.Application.Selection.SelectRow(); ШаблонВорд.Application.Selection.Copy(); Для Счетчик = 1 По 10 Цикл //Заменяем значения ШаблонВорд.Application.Selection.Find.Execute("Номер" ,,,,,,,,,Счетчик,2); ШаблонВорд.Application.Selection.Find.Execute("ЗначениеКолонки1" ,,,,,,,,,Счетчик+10,2); //Последний параметр поиска пустой ШаблонВорд.Application.Selection.Find.Execute("ЗначениеКолонки2" ,,,,,,,,,Счетчик+100,); //Перемещаемся вниз, вставляем из буфера обмена строку ШаблонВорд.Application.Selection.MoveDown(); ШаблонВорд.Application.Selection.Paste(); //Перемещаемся вверх и выделяем строку для замены значений ШаблонВорд.Application.Selection.MoveUp(); ШаблонВорд.Application.Selection.SelectRow(); КонецЦикла; //Вырезаем лишнюю строку ШаблонВорд.Application.Selection.Cut(); //Скрываем обязательную закладку начала таблицы ШаблонВорд.Bookmarks("Таблица1").Select(); ШаблонВорд.Application.Selection.TypeText(" "); КонецЕсли; ОбъектВорд.Application.Visible = Истина; ОбъектВорд.Activate(); //Закрытие документа //ОбъектВорд.Application.Quit(); КонецПроцедуры
Как видно из кода процедуры, сначала находим закладку, выделяем и копируем строку таблицы находящуюся ниже, после заменяем текст на значения и вставляем скопированную строку. Результат работы внешней обработки 1С «Заполнение таблиц в шаблоне Word»:
Загрузка из Excel в 1С, довольно частая задача, которую приходится решать программистам 1С. В данной заметке будет показано, как произвести загрузку данных из файла Excel в 1С, наиболее быстрым и оптимальным способом. Перед тем как показать примеры кода, объяснюю как производить отладку и проверку выполнения SQL запросов к файлу Excel, для последующей загрузки данных в программу 1С.
Для примера будет использоваться файл формата Excel со следующей структурой и данными:
Чтобы выполнить SQL запрос к файлу Excel и проверить результат, необходимо запустить программу Microsoft Excel, перейти в главном меню программы на вкладку «Данные», далее нажать кнопку «Из других источников» и в появившемся меню выбрать пункт «Из Microsoft Query»:
После появится окно «Выбор источника данных», в нем необходимо выбрать пункт «Excel Files*» и нажать «ОК»:
Далее выбрать непосредственно ваш файл Excel для выборки данных. Может появится предупреждение, что «Данный источник данных не содержит видимых таблиц», игнорируем его и нажимаем «ОК». После необходимо в параметрах установить пункт отображать системные таблицы:
После включения данной опции, появится возможность выбора листов из книги Excel и столбцов для запроса:
Дальше необходимо несколько раз нажать «Далее» и на последнем шаге, выбрать пункт «Просмотр или изменение данных в Microsoft Query» и «Готово»:
Откроется окно «Microsoft Query», в котором мы видим выборку данных из нашего файл Excel. Для тестирования и редактирования SQL запросов к файлу Excel, используется кнопка «SQL», при помощи которой вызывается окно редактирования запроса:
Теперь, когда вы знаете, как тестировать ваши SQL запросы к файлу Excel, попробуем загрузить данные в программу 1С, для этого создадим внешнюю обработку, добавим основную форму, для удобства вывода информации добавим реквизит формы с типом «Табличный документ» и отобразим его на форме. В модуле формы добавим процедуру «ПриОткрытии».
Далее приведен код с поясняющими комментариями:
&НаКлиенте Процедура ПриОткрытии(Отказ) //Указываем путь к файлу Excel ФайлExcel = "C:\Users\Константин\Desktop\Данные.xls"; //Создаем объект Файл ФайлОстатков = Новый Файл(ФайлExcel); //Проверка на существование файла Если ФайлОстатков.Существует() Тогда //Формируем строку соединения СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls)}; |DriverId=790; |Dbq=" + ФайлОстатков.ПолноеИмя + "; |DefaultDir=" + ФайлОстатков.Путь + ";"; //Создаем СОМ объект ADODB.Connection Соединение = Новый COMОбъект("ADODB.Connection"); Попытка //Пробуем подключится к файлу Excel Соединение.Open(СтрокаСоединения); Исключение Сообщить("Ошибка соединения ADODB.Connection: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат; КонецПопытки; //Пробуем получить имена колонок из файла Excel //В случае возникновении ошибки: Попробуйте написать: "SELECT * FROM "[Лист1$A1:IV]" или "SELECT * FROM `Sheet1$A1:IV`" ТекстЗапросаSQL = "SELECT * FROM `Лист1$A1:IV`"; Попытка НаборЗаписей = Соединение.Execute(ТекстЗапросаSQL); Исключение Сообщить("Ошибка соединения ADODB.Recordset: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат; КонецПопытки; //Проверяем количество полученных полей Если НаборЗаписей.Fields.Count > 0 Тогда //Выводим полученные имена колонок СтрокДляВывода = ""; Для каждого СтрокаИзНабора Из НаборЗаписей.Fields Цикл СтрокДляВывода = СтрокДляВывода + СтрокаИзНабора.Name + Символы.Таб; КонецЦикла; ВыводСообщений.ДобавитьСтроку(СтрокДляВывода); //Пробуем получить данные из файла Excel ТекстЗапросаSQL = "SELECT * FROM `Лист1$A1:BB`"; Попытка НаборЗаписей = Соединение.Execute(ТекстЗапросаSQL); Исключение Сообщить("Ошибка соединения ADODB.Recordset: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат; КонецПопытки; //Выводим данные на экран Пока НЕ НаборЗаписей.EOF Цикл СтрокДляВывода = ""; Для каждого СтрокаИзНабора Из НаборЗаписей.Fields Цикл СтрокДляВывода = СтрокДляВывода + СтрокаИзНабора.Value + Символы.Таб; КонецЦикла; ВыводСообщений.ДобавитьСтроку(СтрокДляВывода); //Перемещяем курсор дальше НаборЗаписей.MoveNext(); КонецЦикла; Иначе Сообщить("Не найдены наименования колонок!"); КонецЕсли; //Закрываем соединение Соединение.Close(); Иначе Сообщить("Файл: " + ФайлExcel + " не найден!"); КонецЕсли; КонецПроцедуры
Результат выполнения внешней обработки по загрузке данных из файла Excel в 1С с помощью запроса SQL, показан на изображении:
В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.
В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.
Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:
Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:
Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:
&НаКлиенте Процедура ПриОткрытии(Отказ) ЗаполнитьШаблонВорд(); КонецПроцедуры &НаКлиенте Функция ЗаполнитьШаблонВорд() //Попытка создать COM объект Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; //Путь к шаблону ОбъектВорд.Documents.Add("C:\Users\Константин\Desktop\Шаблон.docx"); ШаблонВорд = ОбъектВорд.ActiveDocument; //Получаем все закладки из шаблона Для каждого ЗакладкаВорд Из ШаблонВорд.Bookmarks Цикл Сообщить(ЗакладкаВорд.Name); КонецЦикла; //Заменяем закладку1 на текст ШаблонВорд.Bookmarks("Закладка1").Select(); ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1."); //Заменяем закладку2 на текст ШаблонВорд.Bookmarks("Закладка2").Select(); ШаблонВорд.Application.Selection.TypeText("Текст для закладки №2."); //Заменяем закладку3 на текущую дату ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.TypeText(ТекущаяДата()); ОбъектВорд.Application.Visible = Истина; ОбъектВорд.Activate(); //Закрытие документа //ОбъектВорд.Application.Quit(); КонецФункции
В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:
Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.
Скачать файл обработки 1С и шаблона Word.
Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.
1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
//Заменяем закладку3 на текущую дату ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.Font.Bold = 1; ШаблонВорд.Application.Selection.Font.Size = 20; ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
// Вставка изображения ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:\Users\Константин\Desktop\logo_1c.png");
3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:\Шаблон.docx».
4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); Макет = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); ИмяФайла = КаталогВременныхФайлов() + "\"файл.doc"; Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
Sub Макрос1() ' ' Макрос1 Макрос ' ' Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _ "C:\Users\Константин\Desktop\Тест.txt", SubAddress:="", ScreenTip:="", _ TextToDisplay:="ТестоваяСсылка" End Sub
Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word
Соответственно код для 1С следующий:
Функция ЗаполнитьШаблонВорд() //Попытка создать COM объект Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; //Путь к шаблону ОбъектВорд.Documents.Add("C:\Users\k.blagin\Desktop\Шаблон.docx"); ШаблонВорд = ОбъектВорд.ActiveDocument; //Получаем все ссылки из шаблона Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл Сообщить(ЗакладкаВорд.Name); КонецЦикла; //Меняем адрес уже существующей ссылки ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:\Users\k.blagin\Desktop\Memory.zip"; //Заменяем закладку на ссылку ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3"); ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:\Users\k.blagin\Desktop\Шаблон.docx", "", "Шаблон.docx", "C:\Users\k.blagin\Desktop\Шаблон.docx"); ОбъектВорд.Application.Visible = Истина; ОбъектВорд.Activate(); //Закрытие документа //ОбъектВорд.Application.Quit(); КонецФункции
В программе 1С ERP имеется типовая возможность создавать штрихкоды и выводить их на печать без использования дополнительных средств, пример кода:
//... ПараметрыШтрихкода = Новый Структура; ПараметрыШтрихкода.Вставить("Ширина", 100); ПараметрыШтрихкода.Вставить("Высота", 75); ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(СтрокаТЗ.Штрихкод)); ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN13 ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина); ПараметрыШтрихкода.Вставить("РазмерШрифта", 12); ОбластьШтрихкод = Макет.ПолучитьОбласть("Штрихкод"); ОбластьШтрихкод.Рисунки.ШК.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода); ТабДок.Вывести(ОбластьШтрихкод); //...
Небольшая подсказка для начинающих программистов 1С. Если вы создали внешнюю обработку для заполнения табличной части документа на основе управляемых форм и теперь хотите обновить отображение данных документа, можете воспользоваться следующим способом:
&НаКлиенте Процедура Заполнить(Команда) //Код по изменению и сохранению данных документа в базе данных //... ФормаВладелец = ЭтаФорма.ВладелецФормы; ФормаВладелец.Прочитать(); КонецПроцедуры
Данный код выполняется в форме обработке по заполнению табличной части.
Старые концепты, которые вряд ли, когда либо, будут воплощены в жизнь.