Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Страница 1 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Язык 1С Том 1 Быстрый старт www.howknow1c.ru Электронная книга. Редакция 1 Страница 2 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Содержание Содержание .................................................................................... 3 Вступление ..................................................................................... 6 Что дает Вам эта книга ...................................................................... 7 Профессиональный портал по 1С www.howknow1c.ru .................... 8 Как пользоваться книгой .................................................................. 9 О чем Вам расскажет эта книга ...................................................... 10 Общие сведения ............................................................................12 Краткое описание 1С ....................................................................... 12 Конфигуратор 1С ............................................................................. 14 Объекты метаданных 1С ................................................................. 16 Модули 1С ......................................................................................18 Программные модули 1С............................................................. 18 События и их обработчики .......................................................... 18 Пример программного модуля 1С .............................................. 19 Основные конструкции языка 1С ...............................................20 Переменные ..................................................................................... 20 Функции и процедуры .................................................................... 22 Условные операции и булево ......................................................... 24 Циклы ............................................................................................... 27 Обработка ошибок ........................................................................... 29 Исполнение программ на языке 1С ............................................31 Препроцессор ............................................................................... 32 Исполнение .................................................................................. 33 Объекты и ссылки ........................................................................35 Создание объектов ....................................................................... 35 Страница 3 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Менеджеры для получения объектов из базы данных .............. 35 Ссылки и объекты ........................................................................ 36 Пустая ссылка ............................................................................... 36 Уникальный идентификатор (GUID)........................................... 37 Реквизиты..................................................................................... 38 Доступ к значениям именованных свойств объектов ............... 38 Ограничения .................................................................................... 40 Типы и значения ..........................................................................41 Значение «Неопределено» ........................................................... 41 Типы значений ............................................................................. 41 Преобразование типов ................................................................ 43 Форматирование значений ......................................................... 43 Хранилище значений .................................................................. 47 Работа с типами ............................................................................49 Определение типа и сравнение типов........................................ 50 Базовые типы ............................................................................... 50 Типы базы данных ....................................................................... 50 Типы 1С ........................................................................................ 52 Определение значения ссылочного типа ................................... 52 Работа с типами в запросе ........................................................... 52 Получение доступных типов ....................................................... 53 Работа с типами реквизитов в метаданных конфигурации ...... 54 Указать фильтр типов .................................................................. 54 Описание типов ........................................................................... 55 Работа с метаданными ................................................................60 Метаданные конфигурации ........................................................ 60 Метаданные объекта.................................................................... 63 Работа с файлами .........................................................................65 Особенности работы с файлами клиент-сервер ........................ 66 Страница 4 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ДиалогВыбораФайла .................................................................... 67 КаталогВременныхФайлов, ПолучитьИмяВременногоФайла .. 69 ПодключитьРасширениеРаботыСФайлами, УстановитьРасширениеРаботыСФайлами, ПолучитьФайл, ПоместитьФайл, ПолучитьФайлы, ПоместитьФайлы, ПолучитьИзВременногоХранилища, ПоместитьВоВременноеХранилище........................................... 70 Файл .............................................................................................. 78 Функции работы с файловой системой ...................................... 80 ЧтениеТекста, ЗаписьТекста, ЗначениеВФайл, ЗначениеИзФайла ........................................................................ 85 ЧтениеXML, ЗаписьXML, ЧтениеFastInfoset, ЗаписьFastInfoset, ЧтениеHTML, ЗаписьHTML .......................................................... 88 ПостроительDOM, ЗаписьDOM ................................................... 92 Картинка ....................................................................................... 96 ДвоичныеДанные, Base64Строка, Base64Значение ................... 96 Сообщения ....................................................................................98 1С Сообщить ................................................................................. 98 1С Предупреждение ..................................................................... 99 1С СообщениеПользователю ....................................................... 99 Итоги............................................................................................ 102 Страница 5 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Вступление Чего Вы ждете от своей работы? Если Вы спросите этот вопрос у своих знакомых и друзей - то они наверное ответят Вам в первую очередь я хочу хорошо зарабатывать. Однако, если как следует подумать, приходят в голову и другие важные вещи чтобы работа была интересной, хороший коллектив, перспективы для карьеры, стабильность, условия работы. Те, кто уже работают в технической индустрии (ИТ, IT, АйТи) возможно уже не помнят почему пошли работать именно в этот бизнес, но для них привычно искать в тексте вакансии в первую очередь не сведения о зарплате, а такие важные для программистов вещи как: Самые интересные и творческие задачи Бесплатный чай и плюшки Игровые приставки в офисе в обед и вечером Бесплатные коллективные выезды на природу Красивый дизайнерский офис. Как Вы думаете, почему? В базовый пакет программистов 1С уже включены: Заработная плата выше среднего Оценка по опыту, а не по диплому Удобные условия работы и рабочий график А также, в качестве «плюшек» - свободный неформальный офис и дружный коллектив. дресс-код, Книга «Как стать программистом 1С» расскажет Вам как работается программистам 1С и обеспечит легкий старт (на этот праздник жизни) в профессию. Страница 6 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Что дает Вам эта книга Серия книг «Быстрый старт в 1С» обеспечит Вам достаточный уровень знаний, который требуется для работы с 1С. Обратите внимание - когда мы говорим «начать работать с 1С» мы имеем ввиду не то, что Вы сможете делать скромные опыты или домашние задания... После прочтения книг - Вы сразу сможете начать работать по профессии. В каждой профессии есть свои уровни профессионального опыта. Портал superjob.ru в своем исследовании зарплат программистов 1С выделил 4 таких уровня: Без опыта работы (до 50k) Минимальный опыт работы от полугода (до 75k) С опытом работы (до 100k) Значительный опыт работы (до 160k) PS. Исследование от 14 мая 2012 года. Зарплаты указаны для Москвы в тыс. руб. Эта серия состоит из следующих книг на каждый уровень профессионального опыта в 1С: Как стать программистом 1С план обучения, карьера, экзамены и сертификаты Как работать в 1С что такое 1С, какие конфигурации бывают, как купить 1С, принципы работы в 1С Установка и администрирование пользователей 1С установка и первичная настройка 1С, администрирование пользователей Обновление и настройка обмена данными 1С обновление базы 1С и настройка обмена данными между несколькими базами 1С Разработка справочников и документов 1С базовые понятия для изменения конфигурации базы 1С Разработка отчетов и бизнес-процессов 1С продвинутый уровень изменения конфигурации базы 1С Программирование 1С базовые понятия программирования 1С, разработка форм Язык 1С справочник по основным понятиям языка 1С Язык запросов 1С написание запросов к базе данных 1С Страница 7 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Профессиональный портал по 1С www.howknow1c.ru На сайте howknow1c.ru расположены бесплатные онлайн курсы по программам 1С для программистов и пользователей. Вы можете найти на сайте: новые материалы по работе в 1С и программированию 1С инструменты для удобной работы в 1С инструменты для настройки 1С справочник по конфигурации 1С уроки по разработке в 1С книги из серии «Быстрый старт 1С». Чем отличается книга от сайта? 1) Время идет вперед, когда-то новинкой была 1С 7.7, а сейчас вышла 8.3 и поэтому сведения на сайте могут устаревать. Издания книг имеют редакцию, которая указана на первой странице. Это значит, что все материалы в издании этой книги обновлены на дату выхода редакции. 2) Каждая книга обязательно содержит уроки, написанные специально для нее и которые отсутствуют на сайте 3) Книгу Вы можете взять с собой, читать оффлайн на планшете в метро, распечатать, чтобы читать с листа. Страница 8 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Как пользоваться книгой Во многих фантастических фильмах и книгах можно узнать о правильном способе изучения английского языка. Для этого нужно: Усадить студента в специальное кресло На голове студента закрепить нейронные датчики Включить часовую программу, которая загрузит в мозг студента все нужные знания. Вуаля! Через час обучаемый встает с кресла и запросто говорит на чистейшейшем английском! В реальности такие устройство пока широкого распространения не получили. Поэтому, чтобы как следует освоить изучаемый предмет, Вам нужно: Найти хорошую книгу (например эту) Взять компьютер и 1С (книга расскажет где ее достать) Читать и сразу же пробовать самостоятельно. Книга - это проводник среди огромного сборища информации в мире. Она рассказывает из чего состоит предмет, какие у него части, как ими пользоваться, что надо не забыть посмотреть, попробовать или поискать. Залог Вашего успеха - когда Вы не только узнаете что Вам нужно, но и попробуете это своими собственными руками. Книга состоит из частей. В оглавлении они выделены жирным шрифтом. Каждая часть - это отдельная тема, которую можно изучать отдельно. Темы выстроены в порядке логической последовательности, но если нужно срочно получить информацию по конкретной теме - Вы можете запросто перейти к ней. Тема состоит из статей. Обычно в теме достаточно статей, чтобы дать полное освещение темы целиком. Лучше всего воспринимать тему целиком. Страница 9 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] О чем Вам расскажет эта книга Книга «Язык 1С. Быстрый старт» поможет Вам легко использовать стандартные классы (объекты) встроенного языка 1С - с нуля. Общие сведения Быстрое знакомство с основными понятиями платформы 1С: конфигурацией и объектами конфигурации 1С. Модули 1С Множество объектов конфигурации 1С имеют модули, в которых находится код на языке 1С с алгоритмами обработчиков событий. Основные конструкции языка 1С Сведения по основным конструкциям определению переменных, процедур и ошибок. языка –- циклами, функций, обработке Исполнение программ на языке 1С О работе препроцессора и итоговом выполнении кода на языке 1С. Объекты и ссылки Язык 1С сильно связан с обработкой данных из базы данных, представленных в виде объектов. Работа с данными в основном ведется с помощью объектов связанных с данными (из базы данных) или ссылок на объекты. Типы и значения Сведения о поддерживаемых в языке 1С типах, их преобразовании и форматировании. Работа с типами Подробнее про способы работы в языке 1С с типами данных языка 1С и типами базы данных. Страница 10 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Работа с метаданными Метаданные - это список объектов конфигурации и их свойств. Поговорим о том, как работать с метаданными из языка 1С. Работа с файлами Работа с файлами в языке 1С. Обратите внимание на различия работы с файлами в толстом и тонком клиенте, веб клиенте. Сообщения Три основных метода сообщения информации пользователю. Страница 11 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Общие сведения Краткое описание 1С Мы обсудим основные принципы программирования 1С: Конфигурации и клиенты 1С Режимы клиентов 1С - конфигуратор и исполнение Объекты метаданных Программные модули События. 1С:Предприятие (часто называют просто «1С») – программное обеспечение для автоматизации предприятий. Распространяется в виде: Конфигураций – шаблон из которого создается база данных Клиенты – программы, которые позволяют создавать и изменять шаблоны (для программиста) и использовать шаблоны (для пользователя). Конфигурация содержит: Сведения об объектах метаданных – то есть структуру базы данных Экранные формы Программные модули на языке 1С. На основе конфигурации создается база данных, которая содержит те же сведения и дополнительно: Введенные пользователями данные Данные настроек и администрирования (например, список пользователей). Страница 12 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] База данных 1С может храниться в: Файле (внутренняя структура 1С) СУБД. 1С поддерживает работу с различными СУБД, в том числе: MS SQL, Oracle, PostgreSQL, IBM DB2. Для программиста 1С «в идеале» разницы от использования конкретной СУБД нет, «в реальности» существует незначительная разница в виде ограничений на используемые типы данных и производительность. Предполагается, что 1С более оптимизирована для MS SQL. Существует несколько различных клиентов 1С: Толстый клиент (обрабатывает данные на клиенте) Тонкий клиент и Веб клиент (обрабатывают данные на сервере). Особенность толстого клиента – режим «Конфигуратор», который позволяет создавать и изменять конфигурации. Особенности веб клиента – работа в обычном браузере, без установки дополнительных модулей, язык 1С при этом транслируется в JavaScript. Клиенты 1С поддерживают операционные системы Windows и Linux. Веб клиент (режим исполнения) можно запустить в большинстве распространенных браузеров под любой операционной системой. Страница 13 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Конфигуратор 1С Режим конфигуратора доступен в толстом клиенте для операционных систем Windows и Linux (последнее - начиная с версии 8.3). В окне выбора базы данных необходимо выбрать базу данных курсором и нажать Конфигуратор. Окно конфигурации отображает структуру базы данных. С помощью него можно открыть метаданные на редактирование (и добавлять новые). Открывается командой Конфигурация/Открыть конфигурацию. Страница 14 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] В окне отображены копия конфигурации для изменения. В базе данных существует также рабочая конфигурация. С помощью команды Конфигурация/Обновить конфигурацию базы данных, возможно применить изменения к рабочей конфигурации, или командой Конфигурация/Конфигурация базы данных/Вернуться к конфигурации БД – отменить изменения в копии. Отладчик запускается командой Отладка/Начать отладку (в толстом клиенте) или Отладка/Начало отладки (для выбора конкретного клиента). При этом будет запущен новый клиент. Если клиент уже был запущен ранее, то к нему можно подключиться командой Отладка/Подключение. Коллективная разработка ведется с помощью хранилища конфигурации (команды Конфигурация/Хранилище конфигурации). Хранилище может храниться в файлах или в отдельной базе данных. Принцип работы с хранилищем – каждый программист «захватывает» (команда меню) объекты метаданных (и их отдельные свойства), и в это время другие программисты с захваченным объектами не могут работать - они «захватывают» себе другие. По завершению разработки программист «отпускает» (также команда меню, еще говорят «накатывает») произведенные изменения в хранилище, чтобы другие могли «обновиться из хранилища». Таким образом актуальная копия конфигурации хранится в хранилище. Страница 15 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Объекты метаданных 1С Структура базы данных 1С описывается в конфигурации с помощью объектов метаданных. При этом реальная структура таблиц в базе данных создается и изменяется автоматически, программист 1С об этом не заботится. Объекты метаданных разделены по «видам» или «ролям». Роль объекта метаданных описывает его функцию – справочник (хранение данных), документ (регистрация хозяйственных операций). Верхний уровень в дереве конфигурации – виды объектов метаданных. По нажатию правой кнопки на вид доступна команда «Добавить», которая добавляет конкретный объект. Объекты метаданных состоят из свойств, которые описывают их структуру и пользовательских данных. Так объекты справочники и документы – имеют пользвоательские данные, а объекты отчет и обработка – имеют только свойства, описывающие их. Вводить и просматривать пользовательские данные можно только в режиме исполнения (режим 1С:Предприятие). Просматривать и изменять свойства объекта можно только в режиме конфигуратора. Страница 16 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Распространенные свойства объектов метаданных: Реквизиты и табличные части – описание полей, в которые пользователь сможет вводить даннные (и в данных полях данные будут храниться в базе данных) Формы – шаблоны экранных форм, с помощью которых происходит просмотр и редактирование пользователем данных Модули – программные модули на языке 1С. В языке 1С объект метаданных имеет предопределенные методы (функции). То есть мы можем сделать умозаключение, что вид объекта метаданных определяется набором классов, которые мы можем использовать в языке 1С. Объекты (конфигурации, при работе с ними в языке 1С) всегда связаны с данными из базы данных. Страница 17 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Модули 1С Программные модули 1С Программный код на языке 1С располагается в модулях. Программные модули в конфигурации доступны не «сами по себе», а как одно из свойств объекта метаданных. Открыть модуль можно по нажатию правой кнопки мыши на объект метаданных. Доступны модули: Конфигурации (верхняя ветка в окне конфигуратора) o Модуль сеанса o Модуль приложения (конфигурация толстого клиента) o Модуль управляемого приложения o Модуль внешнего соединения Общие модули (ветка Общие/Общие модули) Модули объекта и менеджера (ветка конкретного объекта метаданных) Модули формы (ветка конкретной формы, внутри ветки объекта метаданных, открыть форму, закладка Модуль в редакторе формы). События и их обработчики Работа программы на встроенном языке 1С строится с помощью событий: Существует ряд событий, которые позволяет обрабатывать платформа 1С На встроенном языке создаются процедуры для обработки данных событий В исполняемом режиме платформа вызывает обработчики при наступлении события. Выполнение начинается событиями в модуле приложения (модули конфигурации), с процедур ПередНачаломРаботыСистемы() и Страница 18 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ПриНачалеРаботыСистемы(). Для каждого вида клиента существует свой модуль. После успешного старта клиента, с отработкой событий «при запуске» 1С отображает интерфейс. Пользователь, работая с интерефейсом вызывает команды, которые обрабатываются дальнейшими событиями. Самые распространенные из них: ПередОткрытием() и ПриОткрытии() – при старте работы любой формы Обработчик на нажатие кнопки. Также существуют обработчики ожидания (запуск на клиенте периодического выполнения процедуры по таймеру) и регламентные задания (запуск по расписанию на сервере независимого выполнения процедуры). Комментарий в программном модуле находится после знаков «//». Пример программного модуля 1С ПЕРЕМ Переменная1; //создание глобальной переменной модуля ПЕРЕМ Переменная2 ЭКСПОРТ; //то же, доступна вне модуля //создание процедуры //также доступно ЭКСПОРТ Процедура Процедура1() //что-то тут делаем КонецПроцедуры //создание функции, т.е. процедуры с возвратом значения //также доступно ЭКСПОРТ Функция Функция1() Возврат ЗначениеРезультатФункции; КонецФункции //код, выполняющийся автоматически при первом обращении к модулю Переменная1 = 20; Переменная2 = "Строковое значение"; Страница 19 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Основные конструкции языка 1С Переменные Создание переменной в модуле, например: ПЕРЕМ Переменная1; Значение у такой переменной будет Неопределено (см. далее), пока далее в коде не будет присвоено явно другое значение. можно использовать только в начале модуля или в начале процедуры/функции. Нельзя использовать в общих модулях. ПЕРЕМ Так как переменную гораздо проще создать, когда она нужна, просто назначив ей значение, например: Переменная1 = 22; , то ПЕРЕМ обычно используют (экспортных) переменных. для создания глобальных Простая переменная доступна («видна») в том модуле (в той процедуре/функции), где она создана. Если же переменная глобальная, то она будет видна из других модулей. Пример создания экспортной переменной: ПЕРЕМ Переменная1 ЭКСПОРТ; Переменная1 = 22; первоначальное значение //в самом начале модуля //в самом конце модуля, Пример доступа к экспортной переменной, созданной в модуле объекта справочника Номенклатура: Страница 20 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] НоменклатураОбъект = Справочники.Номенклатура.СоздатьНовыйЭлемент(); Сообщить(НоменклатураОбъект.Переменная1); //сообщит 22 Пример доступа к экспортной переменной, созданной в модуле формы элемента справочника Номенклатура: НоменклатураОбъект = Справочники.Номенклатура.СоздатьНовыйЭлемент(); НоменклатураФормаЭлемента = НоменклатураОбъект.ПолучитьФорму("ФормаЭлемента"); Сообщить(НоменклатураФормаЭлемента.Переменная1); //сообщит 22 Страница 21 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Функции и процедуры Функция отличается от процедуры результат вычислений, например: возможностью вернуть Функция Функция1(Параметр) Возврат Параметр * 2; КонецФункции Переменная1 = Функция1(10); //Переменная1 будет равна 20 При передаче параметра в процедуру/функцию, он передается «по ссылке». Это значит, что изменяя его внутри процедуры, Вы изменяете его значение, при доступе после окончания функции. Таким образом, предыдущий пример можно написать так: Процедура Процедура1(Параметр) Параметр = Параметр * 2; КонецПроцедуры Переменная1 = 10; Процедура1(Переменная1); Сообщить(Переменная1); //Результатом будет 20 Чтобы передать внутрь процедуры значение переменной, а не ее саму: Процедура Процедура1(ЗНАЧ Параметр) //действия.. КонецПроцедуры При работе с объектами (справочники, документы) необходимо помнить, что внутри функции/процедуры над ними могут быть выполнены действия. Если у функции/процедуры несколько параметров, то ненужный можно пропустить (указав запятую, если пропущен параметр в Страница 22 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] середине), при этом будет передано или Неопределено (см. ниже) или значение по-умолчанию: Функция Функция1(Параметр1, Параметр2, Параметр3 = "Строковое значение") //Чтото делаем КонецФункции //Вызов функции без некоторых параметров //параметр2 будет равен Неопределено //параметр3 будет равен "Строковое значение" Функция1(10); //Вызов функции без второго параметра Функция1(10, , "Значение"); В модуле формы, объекта располагаются обработчики событий. Обработчик можно добавить (назначить) следующими способами: Способ 1: Войти в свойства формы или конкретного поля формы o Толстый клиент - правой кнопкой мыши нажать на поле или на заголовок формы o Тонкий клиент – правой кнопкой мыши нажать на наименование поля в списке полей формы (левый верхний список) Внизу списка свойств будет раздел События со списком полей У требуемого события нажать на кнопку с лупой Способ 2: В редакторе модуля (т.е. когда Вы пишите код), вызвать команду меню Текст/Процедуры и функции (на панели над редактором модуля есть такая же кнопка с изображением лупы и справа выпадающий список) Выбрать из списка возможных события для этого модуля обработчик. Страница 23 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Условные операции и булево Условный оператор ЕСЛИ выглядит следующим образом: Если ОПЕРАЦИЯ-БУЛЕВО Тогда //действия1… ИначеЕсли ОПЕРАЦИЯ-БУЛЕВО Тогда //действия2… Иначе //действия3… КонецЕсли; «Булево» - это флаг вычисления со значениями Истина или Ложь, например: Массив1 = Новый СписокЗначений(); Если Массив1.Количество() > 0 Тогда //действия… КонецЕсли; //другой вариант, полностью аналогичный Если НЕ Массив1.Количество() = 0 Тогда //действия… КонецЕсли; Многие функции/методы объектов возвращают выполнения операции как булево, например: успешность Запрос = Новый Запрос(); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда //действия… КонецЕсли; Условия можно объединять с использованием И и ИЛИ: Массив1 = Новый СписокЗначений(); Если (Массив1.Количество() > 0 и Массив1.Количество() < 10) или Массив.Количество() > 100 Тогда //действия… КонецЕсли; Страница 24 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Условия булево можно использовать непосредственно в коде программы: Переменная1 = 5; флгРезультат = (Переменная1 = 2 + 3); //флгРезультат будет равен ИСТИНА Оператор ЕСЛИ ИНАЧЕ ТОГДА можно заменить более кратким выражением. Следующие два варианта равны: //первый вариант Переменная1 = 0; ВвестиЗначение(Переменная1, "Введите значение больше нуля"); Если Переменная1 < 0 Тогда ТекстСообщения = "Число должно быть больше нуля"; Иначе ТекстСообщения = "Вы загадали число " + Строка(Переменная1); КонецЕсли; Сообщить(ТекстСообщения); //второй вариант Переменная1 = 0; ВвестиЗначение(Переменная1, "Введите значение больше нуля"); ТекстСообщения = ?( Переменная1 < 0, "Число должно быть больше нуля", "Вы загадали число " + Строка(Переменная1)); Сообщить(ТекстСообщения); У реквизитов объектов (справочников, документов и т.п.) есть возможность установить тип булево. Также можно создать переменную булево, например: флгВыполнено = Истина; Далее, в условиях ЕСЛИ, можно писать равнозначно двумя способами: //вариант 1 Если флгВыполнено = Истина Тогда КонецЕсли; //вариант 2 Страница 25 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Если флгВыполнено Тогда КонецЕсли; Второй вариант таит в себе следующую «неприятность» - в связи с нетипизированностью переменных, созданных в модуле (то есть далее в тексте ей легко установить значение флгВыполнено = "Строка"). Если такое произойдет по недосмотру – второй вариант «упадет с ошибкой». Страница 26 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Циклы «Коллекция» - это список. Коллекции часто возвращают различные матоды. Например, таблица – это список строк. Результат запроса – также список строк с данными. Самый распространенный цикл в языке 1С позволяет обойти коллекцию «построчно», например: //Пример с таблицей Таблица = Новый ТаблицаЗначений(); Таблица.Колонки.Добавить("ИмяКолонки"); Для каждого Строка из Таблица Цикл Строка.ИмяКолонки = 1; КонецЦикла; //Пример с запросом – выгрузка данных в таблицу Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура"); Результат = Запрос.Выполнить().Выгрузить(); Для каждого Строка из Результат Цикл Сообщить(Строка.Наименование); КонецЦикла; Второй по распространенности цикл в языке 1С позволяет обойти коллекцию пока условие «истинно» (см. условные операции и булево выше): //Пример с запросом - выборка Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура"); Выборка = Запрос.Выполнить().Выбрать(); //выборка – это последовательный доступ Пока Выборка.Следующий() Цикл //эта функция возвращает Истина, если еще есть строчки Сообщить(Выборка.Наименование); КонецЦикла; //Пример с таблицей Сч = 0; Таблица = Новый ТаблицаЗначений(); Страница 27 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пока Сч < Таблица.Количество() Цикл Строка = Таблица.Получить(Сч); Сч = Сч + 1; КонецЦикла; Выполнение циклов «вечного» цикла: можно прервать, пример организации Сч = 0; Пока Истина Цикл Сч = Сч + 1; Если Сч > 100 Тогда Прервать; КонецЕсли; КонецЦикла; Можно пропустить выполнение кода внутри цикла для некоторых элементов: Для каждого Строка из Таблица Цикл Если Строка.СтоитОтметка = Ложь Тогда Продолжить; КонецЕсли; КонецЦикла; Менее распространенный цикл – это цикл на определенное количество проходов Для Сч = 1 по 10 Цикл //действия… КонецЦикла; Страница 28 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Обработка ошибок Если при исполнении программы происходит ошибка, то 1С сообщает о ней пользователю. Сообщение обычно производится в окне с красным крестом, откуда такие сообщения называют «поймать красный крест» или «не работает, есть красные ошибки». Хорошим тоном считается «обрабатывать ошибки» предусматривать места, где они могут произойти и ставить обработчик, который запишет ошибку «в сообщения администратору», а пользователю или сообщит корректно или найдет способ отработать по-другому. Переменная1 = "22"; Попытка //код, который может вызвать ошибку ЧислоСтрокой = Число(Переменная1); Исключение ТекстОшибки = ОписаниеОшибки(); КонецПопытки Код, в котором может произойти ошибка, обрамляется операторами Попытка/Исключение. В случае, если ошибка происходит, срабатывает выполнение кода между Исключение/КонецПопытки. Если ошибка не происходит, тот код между Исключение/КонецПопытки не выполняется. Страница 29 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Чтобы получить расшифровку ошибки, необходимо получить текст ошибки с помощью функции ОписаниеОшибки() сразу после слова Исключение. Также существует функция ИнформацияОбОшибке(), которую можно вызывать вместо ОписаниеОшибки(). Разница в том, что она возвращает информацию в структурированном виде, а не строкой. Структура, возвращаемая функцией ИнформацияОбОшибке(): Описание (текстовое) Причина (такая же структура) ИмяМодуля ИсходнаяСтрока НомерСтроки. Страница 30 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Исполнение программ на языке 1С Программа на языке 1С перед выполнением компилируется – преобразовывается в специальный код. Компиляций производится в два этапа: Обработка модулей препроцессором Компиляция. Компилятор на входе получает модуль не в том виде, в каком его видит программист. Препроцессор разрезает модуль на части (вырезая не нужное) и потом соединяет его. Это связано с тем, что выполнение текста программы производится на сервере и на клиенте. Есть функции и процедуры, которые не могут быть выполнены на сервере/клиенте. Например на сервере Вы не можете показать пользователю предупреждение с необходимостью нажатия кнопки ОК. Поэтому в модуле предназначен: указываются признаки – для чего он Общий модуль (ветка Общие/Общие модули) – в свойствах модуля указывается может ли он выполняться на сервере и на клиенте В остальных модулях – для этого используются инструкции препроцессора. Страница 31 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Препроцессор Непосредственно в тексте модуля, блоки программного кода, отмечаются: Функция Пример1() КонецФункции //будет выполнена и на клиенте и на сервере #Если Сервер Тогда //будет выполнена только на сервере Процедура Пример2() КонецПроцедуры #КонецЕсли #Если Клиент Тогда //будет выполнена на [любом] клиенте Процедура Пример3() КонецПроцедуры #КонецЕсли Если никаких инструкций препроцессору в тексте не указано, и использована функция, которую нельзя выполнять на сервере/клиенте, то в момент компилирования модуля (при первом доступе к нему) в исполняемом режиме будет вызвана ошибка. «Обертывать» можно не только функции, но и конкретные строки исполняемого кода. Так как компиляция на данный момент еще не началась, то можно с помощью таких блоков создавать функции с одинаковыми наименованиями (для сервера, для клиента). Есть разница между «функция есть на сервере» и «функцию можно вызывать на сервере». Во втором случае функция «видна» с клиента и может быть вызвана. В первом – не видна на клиенте и может быть вызвана только из другой функции, выполняемой на сервере. Поэтому есть инструкция #Сервер (доступен вызов с клиенте) и #НаСервере (видна только на сервере), и аналогично для клиента. В модуле управляемой формы инструкции препроцессору рекомендуется использовать только внутри функций/процедур. Страница 32 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Исполнение После того, как препроцессор «склеил» модуль, он передает его компилятору, который его компилирует. Далее в режиме исполнения код будет выполнен. При выполнении кода одного модуля, [может] происходит разовое/множественное переключения выполнения с клиента на сервер и обратно. Например, если требуется выполнить запрос к базе данных, то выполнение будет переключено на сервер, выполнен запрос, данные переданы на клиент. Таким образом модуль существует на сервере и на клиенте. Переключение исполнения с клиента на сервер и обратно производится «автоматически». По умолчанию толстый клиент выполняет весь код на клиенте и иногда вызывает сервер. Тонкий клиент наоборот – все выполняет на сервере и иногда вызывает клиент (хотя в любом случае инициализация первого вызова сервера производится клиентом). Программист в получившемся «склеенном» модуле может для каждой функции указать, где ее требуется исполнять. Не забываем, что доступ к данным производится на сервере, а инициализация вызова на клиенте. Например: &НаСервере Функция ПолучитьДанныеБазыДанных() Запрос = Новый Запрос(""); КонецФункции &НаКлиенте Процедура ОбработчикНажатияКнопки() ПолучитьДанныеБазыДанных(); КонецПроцедуры Ранее, в толстом клиенте, форма создавалась и была доступна только на клиенте (если не передать ее параметром на сервер, конечно). Управляемая форма создается на сервере и может обрабатываться на клиенте и на сервере. Страница 33 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Поэтому, при выполнении функций модуля, при переключении выполнения с клиента на сервер и обратно, передаются кроме прочего все данные формы (называется «контекст»). Данных может быть много и передаваться они будут «долго». А в вызываемой функции они могут быть и не нужны, она их не использует вовсе. Для таких случаев есть директива &НаСервереБезКонтекста. Справочник инструкций и директив Препроцессор Компилятор #Клиент / #Сервер #НаКлиенте / #НаСервере #ВнешнееСоединение #ТонкийКлиент #ВебКлиент #ТолстыйКлиентОбычноеПриложение #ТолстыйКлиентУправляемоеПриложен ие &НаКлиенте &НаСервере / &НаСервереБезКонтекста &НаКлиентеНаСервере / &НаКлиентеНаСервереБезКонтекс та Простой пример: Пример: #Если ИНСТРУКЦИЯ #Тогда #КонецЕсли &НаСервереБезКонтекста Функция ВремяСервера() Возврат ТекущаяДата(); КонецФункции Доступно несколько условий по И и ИЛИ. Доступны #ИНАЧЕ #Если ИНСТРУКЦИЯ1 ИЛИ ИНСТРУКЦИЯ2 Тогда #Иначе #КонецЕсли Страница 34 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Объекты и ссылки Язык 1С сильно «завязан» на работу с данными. Действительно, основная задача - обработка данных, полученных из базы данных запросом или другими способами. В других языках с данными, полученными из базы данных обычно работают «как с таблицей». В 1С такое тоже возможно – выполнить запрос, получить «в ответ» таблицу и работать с ней. Однако более распространенный способ, одна из «фишек 1С» - это работа с данными как с объектами. Например объект Справочник.ИмяСправочника позволяет работать с конкретным справочником, при этом объект имеет свойства (поля с данными) и стандартные методы. Работа с объектом ведется тогда, когда требуется создать объект или изменить существующий. В остальных случаях (например поиск объекта, использование его в другом объекте) –- используется ссылка на объект. Создание объектов Объект можно создать с помощью оператора Новый, при этом вызывается конструктор данного типа, если у типа несколько конструкторов – он выбирается по указанным параметрам: Переменная1 = Новый СписокЗначений(); Менеджеры для получения объектов из базы данных Если требуется создать объект, связанный с данными в базе данных (то есть фактически получить его из базы данных), вместо использования оператора Новый, используются менеджеры. Страница 35 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Почти для каждого вида метаданных (отображенного в дереве метаданных в окне конфигурации, см. выше) доступен одноименный менеджер, который позволяет получить значение из базы данных по признаку или создать новое для записи в базу данных. Например: Переменная1 = Справочники.ИмяСправочника.СоздатьЭлемент(); Переменная1 = Справочники.ИмяСправочника.НайтиПоНаименованию("Наименование"); Ссылки и объекты Работа с объектами, связанными с данными в базе данных может вестись двумя способами – с помощи «ссылки на данные» и объекта. Ссылка – это данные, доступные только для чтения. Объект – это данные, доступные для чтения, изменения и записи. Работа со ссылкой производится гораздо быстрее, чем с объектом. Ссылка на данные получается с помощью функций вида: СправочникСсылка = Справочники.ИмяСправочника.НайтиПоНаименованию() Объект можно получить из ссылки или создать с нуля: СправочникОбъект = СправочникСсылка.ПолучитьОбъект(); СправочникОбъект = Справочники.ИмяСправочника.СоздатьЭлемент(); Пустая ссылка Ссылка может быть пустой, это значит, что создан «пустой» экземпляр объекта, который не связан с данными. СправочникСсылкаПустая = Справочники.ИмяСправочника.ПустаяСсылка(); Также ссылку можно проверить на заполненность: Страница 36 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Если СправочникСсылка.Пустая() Тогда //… КонецЕсли Уникальный идентификатор (GUID) Любой элемент справочника или документ хранится в базе данных. Для идентификации он имеет уникальный «номер» в рамках базы данных - GUID. В понятиях встроенного языка 1С, этот GUID – это ссылка. Узнать идентификатор можно с помощью универсального метода любого объекта ссылочного типа: СправочникСсылка = Справочники.ИмяСправочника.НайтиПоНаименованию("Наименование"); GUID = СправочникСсылка.УникальныйИдентификатор(); Возвращаемое значение данного метода имеет специальный тип. Если необходимо сравнивать значение со строкой, не забудьте преобразовать его к строке с помощью Строка(Параметр). GUID назначается в момент первой записи объекта. Уже до записи можно узнать GUID, который будет назначен объекту при записи: СправочникОбъект = Справочники.ИмяСправочника.СоздатьЭлемент(); GUID = СправочникОбъект.ПолучитьСсылкуНового().УникальныйИдентификатор( ); Также перед записью можно назначить свой GUID. Это бывает полезным, например, при обмене данными: GUID = "Нужный нам GUID"; //строка GUID обычно выглядит 6F9619FF-8B86-D011-B42D-00CF4FC964FF СправочникОбъект = Справочники.ИмяСправочника.СоздатьЭлемент(); СправочникОбъект.УстановитьСсылкуНового(Справочники.ИмяСправочни ка.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID))); Страница 37 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Реквизиты При работе со значениями, возможно столкнуться со следующими способами хранения и доступа к данным: Переменная – созданная в модуле программистом, нетипизированная Реквизит объекта (справочника, документа), добавленный в конфигураторе – хранится в базе данных, строго типизирован Реквизит формы – поле на форме, строго типизирован. Поле на форме показывает «какие-то данные». Данные могут быть напрямую связаны с реквизитом объекта (указаны в свойстве поля формы ПутьКДанным). Также форма может иметь свои реквизиты, они не записываются в базу данных, их устанавливает программист в процедурах и функциях модуля формы (обычно в процедуре обработчике ПриОткрытии формы). Доступ к значениям именованных свойств объектов У многих объектов наименования. в 1С есть свойства, которые имеют Например: элемент справочника имеет реквизиты с наименованиями форма имеет реквизиты с наименованиями у таблицы есть колонки с наименованиями у строки таблицы есть поля с такими же наименованиями, как колонки у таблицы. Если у объекта есть свойства (реквизиты, колонки и т.п.), у которых есть наименования, то к ним можно обращаться двумя способами. Способ 1: Объект.НаименованиеСвойства Пример: СправочникСсылка = Справочники.Справочник1.СоздатьЭлемент(); Страница 38 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] СправочникСсылка.Наименование = "Наименование справочника"; Способ 2: Объект[НаименованиеСвойства]; Пример: СправочникСсылка = Справочники["Справочник1"].СоздатьЭлемент(); СправочникСсылка["Наименование"] = "Наименование справочника"; Если в наличии имеются два объекта с именованными свойствами и нужно скопировать их значения, удобно использовать процедуру ЗаполнитьЗначенияСвойств(КудаКопировать, ОткудаКопировать) которая копирует значения совпадают, пример: всех свойств, имена которых //таблица, которая будет заполнена нужными данными //у таблицы две колонки – Наименование и НужныйРеквизит Таблица = Новый ТаблицаЗначений(); Таблица.Колонки.Добавить("Наименование"); Таблица.Колонки.Добавить("НужныйРеквизит"); Таблица = ПолучитьДанные(); //функция, которая заполняет таблицу нужными данными //по каждой строке таблицы создаем элемент справочника //у справочника есть Наименование (предопределенный реквизит) и реквизит, который мы добавили НужныйРеквизит Для каждого Строка из Таблица Цикл СправочникОбъект = Справочники.Справочник1.СоздатьЭлемент(); ЗаполнитьЗначенияСвойств(СправочникОбъект, Строка); СправочникОбъект.Записать(); КонецЦикла; Страница 39 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Ограничения Не все объекты 1С доступны на клиенте/сервере и разных видах клиентов. Например, в тонком клиенте недоступны многие объекты, в том числе таблица значений. В этом случае 1С выдаст ошибку, сообщая о своем незнакомстве с этим объектом. При работе в тонком клиенте в модуле формы, при вызове сервера нужно не забывать, что на сервер передаются данные формы. При наличии значительного количества данных, и частых вызовах клиент-сервер программа будет работать медленно, размер трафика сети будет увеличиваться. При работе в толстом клиенте код также может выполняться и на клиенте и на сервере, при этом, когда с клиента вызывается функция на сервере производится перенос на сервер данных (параметров функций). Не все параметры могут быть переданы между клиентом и сервером, в этом случае 1С выдает ошибку «мутабельного значения». Страница 40 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Типы и значения Значение «Неопределено» – это значение, которое обозначает, что значения нет. С помощью этого значения можно «обнулять» переменные, в том числе для неявного вызова деструктора, например COM объектов. Неопределено Переменная1 = Новый COMОбъект("Excel.Application"); Переменная1 = Неопределено; Аналогичное значение NULL, которое может вернуть запрос, при попытке получить данные из базы данных, если таковые получить не удалось. Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.Поле1 = NULL Тогда Продолжить; КонецЕсли; КонецЦикла; Типы значений В качестве «переменных» возможно использовать: Переменные, созданные в тексте программы (описанными выше способами) Реквизиты объекта метаданных или формы (созданными в конфигураторе, с указанием точного типа). Реквизит может иметь составной тип, то есть несколько возможных. Назначение значения пользователем в этом случае может быть двухэтапное: Выбор типа значения из доступных Выбор значения. Страница 41 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] По умолчанию такой реквизит имеет значение Неопределено. Когда выбран тип, но еще не выбрано значение – пустое значение этого типа (0 для числа, пустая ссылка для ссылочных типов, см. ниже). И наконец потом – значение. Из программы назначения значения производится напрямую, без промежуточного выбора типа. Определить тип значения возможно несколькими способами: //способ 1 – сравнение с известными типами Переменная1 = 12; Если ТипЗнч(Переменная1) = Тип("Число") Тогда //… ИначеЕсли ТипЗнч(Переменная1) = Тип("СправочникСсылка.ИмяСправочника") Тогда //… КонецЕсли; //способ 2 – с помощью готового списка типов СписокТипов = Новый Массив(); СписокТипов.Добавить(Тип("СправочникСсылка.Справочник1")); СписокТипов.Добавить(Тип("Число")); Типы = Новый ОписаниеТипов(СписокТипов); Переменная1 = 12; Если Типы.СодержитТип(ТипЗнч(Переменная1)) Тогда //… КонецЕсли //способ3 – аналогично 2, но список типов берем у реквизита, определенного для справочника ЗнчСправочника = Справочники.Справочник1.НайтиПоНаименованию("Какое-то наименование"); Переменная1 = 12; Если ЗнчСправочника.Метаданные().Реквизиты.Реквизит1.Тип.СодержитТип( ТипЗнч(Переменная1)) Тогда //… КонецЕсли //способ 4 – для ссылочных типов – определение имени типа ЗнчСправочника = Справочники.Справочник1.НайтиПоНаименованию("Какое-то наименование"); ИмяСправочника = Строка(ТипЗнч(ЗнчСправочника)); //будет равно "Справочник1" ИмяСправочника = ЗнчСправочника.Метаданные().Имя; //аналогично Страница 42 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗнчСправочника)); //определение, что это справочник Преобразование типов Значение простых типов можно преобразовывать с помощью оператора - наименования типа: //в число ЗнчЧисло = Число("22"); //при невозможности преобразовать будет вызвана ошибка, поэтому лучше использовать обработчик ошибок (см. далее) //в строку ЗнчСтрока = Строка(22); ЗнчСтрока = СокрЛП(22); ЗнчСтрока = Формат(22, "ЧГ=0"); //в дату ЗнчДата = Дата("20120101120000"); //01.01.2012 12:00:00 ЗнчДата = Дата(2012, 01, 01, 12, 0, 0); ЗнчДата = Дата(2012, 01, 01); Преобразование значений сложных типов: //создаем список типов, в которые требуется преобразовывать СписокТипов = Новый Массив(); СписокТипов.Добавить(Тип("СправочникСсылка.Справочник1")); Типы = Новый ОписаниеТипов(СписокТипов); //преобразование Знч = Типы.ПривестиЗначение(Стр); Форматирование значений Для точного указания формата используется функция Формат(), с помощью которой возможно указать требуемое представление. ЧислоСтрокой = Формат(2400, "Настройки") В качестве строки «Настройки» нужно указать требуемый формат 1С. Такие настройки указываются в специальном закодированном виде. Рассмотрим наиболее часто используемые настройки: Страница 43 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Формат 1С даты и числа по правилам различных стран Если Вам требуется вывести дату или число и не хочется заморачиваться со знанием как они должны быть представлены по правилам нужной страны, есть простейшая настройка, которая позволит Вам это сделать: L = КраткоеНаименованиеНужнойСтраны Пример вывода даты по правилам некоторых стран: Формат( ТекущаяДата(), «L=ru») > 28.03.2012 14:21:32 Формат( ТекущаяДата(), «L=en») > 3/28/2012 2:21:24 PM Формат( ТекущаяДата(), «L=fr») > 28/03/2012 14:22:08 Формат даты в языке 1С Если настройки по умолчанию Вам недостаточно и хотелось бы самостоятельно указать порядок частей даты и символы их разделения, необходимо использовать настройку: ДФ = "дмг чмс" Соответственно «дмг» – это день, месяц и год, а «чмс» – это часы, минуты и секунды. Любую из этих частей возможно пропустить. Порядок следования – любой. Символы, указанные между частями будут использованы как символы разделения. Символ части даты может быть указан несколько раз подряд, от этого зависит вид этой части даты, например «д» или «дд» или «дддд». Расшифровка частей даты: д – день o маленькая «д» o может быть указана от 1 до 4 раз М – месяц o большая «М» Страница 44 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] o может быть указана от 1 до 4 раз г – год o маленькая «г» o может быть указана 1 или 2 или 4 раза ч – часы o маленькая «ч» – 12ти часовой формат o большая «Ч» – 24х часовой формат o может быть указана 1 или 2 раза м – минуты o маленькая «м» o может быть указана 1 или 2 раза с – секунды o маленькая «с» o может быть указана 1 или 2 раза вв – отображение AM/PM для 12ти часового формата к – квартал. Пример вывода даты с указанием правил: Формат(ТекущаяДата(), "ДФ=""дд.ММ.гггг чч:мм:сс""") > 28.03.2012 02:44:44 Формат(ТекущаяДата(), "ДФ="" М / д /гггг ч:м:с вв""") > 3/28/2012 2:44:44 PM Формат(ТекущаяДата(), "ДФ=""дд/ММ/гггг чч:мм:сс""") > 28/03/2012 02:44:44 Формат(ТекущаяДата(), "ДФ=""дддд, дд ММММ гггг""") > среда, 28 марта 2012 Формат числа в языке 1С В отличие от форматирование даты, где все достаточно просто, для форматирования числа есть множество вариантов параметров. Здесь рассмотрены те, которые чаще применяются. Первая «проблема» связана с группировкой по умолчанию цифр в числах по 3 и разделением групп пробелом, например: СтрЧисло = Строка(22300500) > 22 300 500 Страница 45 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Это неудобно, когда число преобразовывается к строке не для красивого и понятного вывода пользователю, а для служебных нужд. На это можно повлиять с помощью параметра «ЧГ», например: Формат(22300500, "ЧГ=0") >22300500 //вообще убрали нули Формат(22300500, "ЧГ=6") > 22 300500 //сделали группировку только миллионов Параметр, который позволяет округлить число при выводе до нужного количества цифр после запятой «ЧДЦ»: Формат(3.535353, "ЧДЦ=""2""") > 3,54 Параметр, который позволяет указать символ-разделитель целой и дробной части «ЧРД»: Формат(3.535353, "ЧРД="".""") > 3.535353 Для некоторых случаев бывает полезно иметь возможность вместо числа «0» отображать что-то другое: пустую строку или «не заполнено». Это позволяет делать параметр «ЧН»: Формат(0, "ЧН=""<не заполнено>""") > <не заполнено> Страница 46 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Хранилище значений ХранилищеЗначения – это объект в языке 1С, который позволяет хранить в базе данных прочие значения, например картинки и файлы, структуры и таблицы значений. Сначала мы создаем значение, например: Знч = Новый ТаблицаЗначений(); Потом помещаем его в хранилище значений: Хранилище = Новый ХранилищеЗначения(Знч, Новый СжатиеДанных(9)); Сжатие данных с параметром «9» означает, что данные будут храниться в архивированном виде, с максимальной степенью сжатия. Чтобы сохранить такое значение в базу данных, нужно создать объект конфигурации (справочник, документ и т.п.), у которого добавить реквизит с типом ХранилищеЗначения. СправочникСсылка = Справочники.Хранилище.СоздатьЭлемент(); СправочникСсылка.ХранилищеЗначения = Хранилище; СправочникСсылка.Записать(); Кроме хранения таких значений в базе данных, мы также можем сохранить такое значение в файл, например: Настройки = Новый Структура(); Настройки.Вставить("ПоУмолчанию", Истина); Настройки.Вставить("Наименование", "Наименование1"); Хранилище = Новый ХранилищеЗначения(Настройки, Новый СжатиеДанных(9)); ЗначениеВФайл("C:\", Хранилище); Страница 47 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пример – сохранение значения из файла: //Значение - картинка из файла Файл = Новый Картинка("C:\ФайлКартинки.jpg"); Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9)); //Значение - произвольный файл Файл = Новый ДвоичныеДанные("C:\ИсполняемыйФайл.exe"); Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9)); //Значение - текстовый файл Файл = Новый ЧтениеТекста("C:\ТекстовыйФайл.txt"); ТекстовыеДанные = Файл.Прочитать(); Хранилище = Новый ХранилищеЗначения(ТекстовыеДанные, Новый СжатиеДанных(9)); Значение, помещенное в хранилище значений нельзя использовать, пока оно там находится. Чтобы работать с ним, его нужно «распаковать» обратно, например: Знч = Хранилище.Получить(); Если Знч = Неопределено Тогда Сообщить("Ошибка получения значения из хранилища"); КонецЕсли; Страница 48 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Работа с типами Так как в программном коде мы работаем со значениями, то периодически требуется знать их тип. Тип всегда указывается в метаданных у реквизитов - в справочниках, документах. Работа с типами часто используется: Условия в программе Разные действия в зависимости от типа значения в конструкции «Если – Тогда –» Ограничения при работе в интерфейсе Запрет или разрешение пользователю вводить в поле на форме значения определенных типов. Определение фактического параметра функции/процедуры Если параметр функции/процедуры может быть любого типа, то нужно его определить, чтобы правильно получить значение. Тип можно получить: Определить тип фактического значения Значения-объекты имеют свойства, в которых указан разрешенный тип (например типы разрешенные в колонке таблицы, в поле на форме, в метаданных) или методы, которые возвращают эти типы Из метаданных – можно получить тип так, как он указан в метаданных в конфигураторе. Типы в 1С можно разделить на три вида: Базовые типы Типы базы данных (ссылочные, объекты) Типы 1С. Страница 49 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Определение типа и сравнение типов Узнать тип значения можно с помощью функции ТипЗнч(Переменная) Чтобы понять какой тип эта функция вернула – нужно указать нужный нам Тип("ИмяТипа") Например, определение (сравнение) типа переменной: Если ТипЗнч(Переменная) = Тип("ИмяТипа") Тогда Какие типы писать в качестве ИмяТипа? Базовые типы Базовые типы 1С - число, строка, дата, булево. Например: Знч = 12; Если ТипЗнч(Знч) = Тип("Число") Тогда ИначеЕсли Знч = Тип("Строка") Тогда ИначеЕсли Знч = Тип("Дата") Тогда ИначеЕсли Знч = Тип("Булево") Тогда КонецЕсли; Типы базы данных 1С хранит данные в базе данных, но не в виде отдельных записей, а в виде объектов. Большинство сохраняемых объектов (в том числе: справочники, документы, перечисления, бизнес-процессы, задачи) доступны в виде Объекта (для изменения и записи) и в виде Ссылки (для чтения). Подробнее см. «Ссылки и объекты». Например: Знч = Справочники.Организации.ПустаяСсылка(); Страница 50 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Если ТипЗнч(Знч) = Тип("СправочникСсылка.Организации") Тогда ИначеЕсли Знч = Тип("СправочникОбъект.Организации") Тогда ИначеЕсли ТипЗнч(Знч) = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда ИначеЕсли Знч = Тип("ДокументОбъект.ПоступлениеТоваров") Тогда КонецЕсли; Регистры могут быть представлены различными типами. Имя типа регистра составное: РегистрТипрегистраТипдоступа.ИмяРегистра Типы регистров: Сведений Накопления Бухгалтерии Расчета. Типов доступов к регистру несколько. Чаще всего используются: НаборЗаписей Список Выборка Запись КлючЗаписи. Итого, пример: Если ТипЗнч(Знч) = Тип("РегистрСведенийСписок.ИмяРегистра") Тогда ИначеЕсли Знч = Тип("РегистрНакопленияНаборЗаписей.ИмяРегистра") Тогда КонецЕсли; Страница 51 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Типы 1С Язык 1С позволяет работать со множеством объектов, создаваемых динамически в программе, например – массив, список значений, таблица значений, структура– Такие типы указываются по их названию (одним словом, без пробелов). Например: Если ТипЗнч(Знч) = Тип("Массив") Тогда ИначеЕсли Знч = Тип("СписокЗначений") Тогда КонецЕсли; Определение значения ссылочного типа Работа со всеми объектами базы данных (справочники, документы–) ведется через ссылки. Например, если мы хотим в документе сделать реквизит – справочник, то его тип будет «СправочникСсылка.ИмяСправочника». Мы можем определить является ли ссылка справочником или документом с помощью метода ТипВсеСсылки() Например: Значение = Справочники.Организации.ПустаяСсылка(); Если Справочники.ТипВсеСсылки().Содержит( ТипЗнч(Значение) ) Тогда //это справочник ИначеЕсли Документы.ТипВсеСсылки().Содержит( ТипЗнч(Значение)) Тогда //это документ КонецЕсли; Работа с типами в запросе В запросе тип можно проверить двумя способами. Первый – аналогично описанному, но в имени типа не указывается «Ссылка» или «Объект», то есть вместо «СправочникСсылка.Организации» пишем «Справочник.Организации» Страница 52 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Например: "ВЫБРАТЬ | ВЫБОР | КОГДА ТИПЗНАЧЕНИЯ(Организация) = ТИП(Справочник.Организации) | ТОГДА Организация | ИНАЧЕ NULL | КОНЕЦ КАК Организация |ИЗ | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров" Второй – сравнение ссылок, например: "ВЫБРАТЬ | ВЫБОР | КОГДА Организация ССЫЛКА Справочник.Организации | ТОГДА Организация | ИНАЧЕ NULL | КОНЕЦ КАК Организация |ИЗ | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров" Получение доступных типов У множества объектов есть свойство содержит список типов: .ТипЗначения, которое Поле на форме толстого клиента ЭлементыФормы.ИмяПоля.ТипЗначения Поле на форме тонкого клиента (исключение: называется ДоступныеТипы) Элементы.ИмяПоля.ДоступныеТипы Колонка таблицы значений, дерева значений Реквизит формы Элемент отбора – Как работать с этим списком типов – см. далее «Описание типов». Страница 53 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Работа с типами реквизитов в метаданных конфигурации При добавлении и редактировании реквизитов в конфигураторе программист указывает тип(ы) реквизита. В программном коде на языке 1С можно получить (узнать) тип(ы) реквизита. Подробнее про работу с метаданными см. далее «Работа с метаданными». Основные методы: У объекта 1С вызвать метод Метаданные(), который возвращает метаданные конкретного объекта и далее работать со списком реквизитов (и реквизитов табличной части) Документы.ПоступлениеТоваров.ПустаяСсылка().Метаданные().Реквизи ты Использовать глобальную переменную «Метаданные», которая возвращает все метаданные конфигурации, и далее выйти на реквизиты конкретного объекта Метаданные.Документы.ПоступлениеТоваров.Реквизиты У реквизита есть свойство .Тип, которое содержит список типов, установленный в конфигураторе у этого реквизита. Как работать с этим списком типов – см. далее «Описание типов». Указать фильтр типов У многих объектов возможнол указать фильтр типов значений, возможных к использованию, например: Список значений (.ДоступныеЗначения) Поле формы управляемого клиента (.ДоступныеТипы) Страница 54 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Там, где фильтра не доступен к изменению, доступно указать фильтр в методе объекта. Например у колонки таблицы (дерева) значений есть .ТипЗначения и мы не можем его изменять, но при добавлении колонки с помощью метода .Добавить() вторым параметром можно указать список доступных типов. Чтобы указать список типов для фильтра – используется список типов, как с ним работать – см. далее «Описание типов». Описание типов Когда требуется работать со списком типов – используется объект ОписаниеТипов (см. «Получение доступных типов», «Работа с типами реквизитов в метаданных конфигурации», «Указать фильтр типов в фильтре»). Получить список типов Предположим, что Вы получили готовый объект ОписаниеТипов: ЭлементыФормы.ИмяПоля.ТипЗначения ДокументСсылка.Метаданные().Реквизиты.ИмяРеквизита.Тип СписокЗначений.ДоступныеЗначения Получить список типов из объекта ОписаниеТипов можно с помощью метода .Типы(), например: Для каждого ДоступныйТип из ЭлементыФормы.ИмяПоля.ТипЗначения Цикл Если ДоступныйТип = Тип("Строка") Тогда //… КонецЕсли; КонецЦикла; Страница 55 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Проверка наличия типа в списке Если требуется просто проверить – есть ли в списке типов требуемый, можно использовать метод .СодержитТип(), например: Если ЭлементыФормы.ИмяПоля.ТипЗначения.СодержитТип( Тип("Строка") ) Тогда //… КонецЕсли; Приведение значения к разрешенному типу Если у Вас имеется значение (например, переменная со значением) и имеется фильтр типов значений в объекте ОписаниеТипов, то возможно привести значение к тем ограничениям типов, которые указаны в объекте ОписаниеТипов. Например: ЗначениеРазрешенногоТипа = ОписаниеТиповФильтр.ПривестиЗначение( НекотороеЗначение ); Создание описания типов Создать объект ОписаниеТипов требуется в тех случаях, когда требуется указать какой фильтр типов будет установлен, например, при добавлении колонки таблицы значений методом .Добавить (фильтр типов указывается вторым параметром), или для установки фильтра разрешенных типов в список значений в свойстве .ДоступныеЗначения Если в списке разрешенных типов присутствует только один тип, то в качестве параметра при создании объекта ОписаниеТипов указывается просто название типа (см. выше «Работа с типами»). Страница 56 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Например: ФильтрТипов = Новый ОписаниеТипов("Строка"); Если в списке разрешенных типов нужно указать список типов, то требуется сначала создать массив типов и указать в качестве параметра массив. Обратите внимание – в массиве указываются не наименования типов, а типы(!). Например: мТипов = Новый Массив(); мТипов.Добавить("Строка"); мТипов.Добавить("Число"); мТипов.Добавить("СправочникСсылка.Организации"); ФильтрТипов = Новый ОписаниеТипов(мТипов); При добавлении базовых типов (строка, число, дата) Вы указываете имя типа. Но ведь базовые типы имеют настройки – длину строки, разрядность числа, дата и время или только дата. При создании объекта ОписаниеТипов возможно указать дополнительными параметрами настройки базовых типов (любой из указанных параметров настроек – необязательный и можно пропустить). Новый ОписаниеТипов(ИмяТипа, НастройкиТипаЧисло, НастройкиТипаСтрока, НастройкиТипаДата); Настройки числа Создадим настройку для целого числа с 5 цифрами: 99 999 НастройкаТипаЧисла = Новый КвалификаторыЧисла(5,0); Страница 57 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Создадим настройку для дробного числа с 5 цифрами до запятой и 2 цифрами после запятой: 99 999,99 НастройкаТипаЧисла = Новый КвалификаторыЧисла(5,2); Настройка для того же числа, что и выше, и дополнительно – неотрицательного: НастройкаТипаЧисла = Новый КвалификаторыЧисла(5,2, ДопустимыйЗнак.Неотрицательный); Настройки строки Если необходимо использовать строку неограниченной длины – настройку указывать не надо. Настройка для строки длиной 100 символов: НастройкаТипаСтроки = Новый КвалификаторыСтроки(100); Настройка для строки длиной 100 символов, значения которой дополняются до 100 символов пробелами: НастройкаТипаСтроки = Новый КвалификаторыСтроки(100, ДопустимаяДлина.Фиксированная); Настройки даты Если необходимо использовать дату и время – настройку указывать не надо. Настройка для только даты, без времени (значение будет содержать время 00:00:00): НастройкаТипаДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата); Страница 58 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Настройка для только времени, без даты (значение будет содержать дату 01.01.0001): НастройкаТипаДаты = Новый КвалификаторыДаты(ЧастиДаты.Время); Пример использования настроек: мТипов = Новый Массив(); мТипов.Добавить("Строка"); мТипов.Добавить("Число"); ФильтрТипов = Новый ОписаниеТипов(мТипов, Новый КвалификаторыЧисла(10,2), Новый КвалификаторыСтроки(100)); Другой пример использования настроек: ФильтрТипов = Новый ОписаниеТипов("Дата",,, Новый КвалификаторыДаты(ЧастиДаты.Дата)); Страница 59 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Работа с метаданными Метаданные – это список справочников, документов, их реквизитов и прочего, составляющего конфигурацию. Список метаданных правится программистов в конфигураторе в окне конфигурации. Из программы на языке 1С доступен список метаданных и их свойства. Это удобно, когда требуется получить список документов в конфигурации или отработать все реквизиты документа. Метаданные конфигурации Глобальная переменная Метаданные дает доступ к метаданным всей конфигурации (т.е. к «корню» конфигурации). Далее через точку можно обращаться к «коллекциям» - документы, справочники и т.п., чтобы выйти на конкретный справочник или документ, у которых соответственно есть «коллекции» реквизиты, табличные части и т.п. – все, как в конфигураторе, в дереве конфигурации. Пример – создадим список всех документов конфигурации для того, чтобы пользователь мог выбрать нужный документ из списка: спДокументовКонфигурации = Новый СписокЗначений(); //сюда будем сохранять список //Метаданные - глобальная переменная, которая дает доступ ко всем метаданным конфигурации //Метаданные.Документы - коллекция документов конфигурации Для каждого Документ из Метаданные.Документы Цикл //Документ - это метаданные документа (каждого, так как мы обходим их в цикле) Страница 60 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //.Имя - наименование документа так, как оно задано в конфигурации //.Синоним - "человеческое" наименование документа, которое отображается пользователю //список значений может хранить значение (имя документа) и "представление для пользователя" (как раз - синоним документа) спДокументовКонфигурации.Добавить( Документ.Имя, Документ.Синоним ); КонецЦикла; //даем возможность пользователю выбрать из списка нужный документ элДокумент = спДокументовКонфигурации.ВыбратьЭлемент(); //если пользователь нажал "Отмена", то результатом выбора будет значение НЕОПРЕДЕЛЕНО, иначе результатом будет - выбранный элемент Если элДокумент <> Неопределено Тогда //в .Значение списка значений мы записывали имя документа "как в конфигурации" //создадим новый документ с таким именем, напомним - к документам можно обращаться Документы.ИмяДокумента или Документы[ИмяДокумента] обДокумент = Документы[элДокумент.Значение].СоздатьДокумент(); //ДокументОбъект.ПолучитьФорму() - возвращает форму с указанным именем, а если имя не указано - то форму "поумолчанию" обДокумент.ПолучитьФорму().Открыть(); КонецЕсли; Пример – для общего журнала документов (отображающего все виды документов) создадим запрос, который вернет список всех документов: ТекстЗапроса = ""; Для каждого Документ из Метаданные.Документы Цикл //несколько запросов объединяются друг с другом строкой "ОБЪЕДИНИТЬ ВСЕ" //если это не первая итерация цикла, то нужно добавить объединение запросов Если не ПустаяСтрока(ТекстЗапроса) Тогда ТекстЗапроса = ТекстЗапроса + " | | ОБЪЕДИНИТЬ ВСЕ | "; Страница 61 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] КонецЕсли; //добавляем имя документа //вид документа - добавляем строкой, выведем пользователю синоним метаданных //момент времени - используем для сортировки документов (подробнее см. "Момент времени") //ссылка - для обращения потом к документу //ограничим по периоду, так как если много документов получение списка может занять слишком много ресурсов //обратите внимание - если в конфигурации много видов документов, то запрос работать не будет - так как существует ограничение на кол-во таблиц в одном запросе //в этом случае нужно прописать разбиение запроса на пакеты по N документов и объединение результатов серии запросов в одной таблице ТекстЗапроса = ТекстЗапроса + " |ВЫБРАТЬ | """ + Документ.Синоним + """ КАК ВидДокумента, | Дата, | Номер, | МоментВремени, | Ссылка |ИЗ | Документ." + Документ.Имя + " |ГДЕ | Дата между &НачалоПериода И &ОкончаниеПериода"; КонецЦикла; //добавим сортировку ТекстЗапроса = ТекстЗапроса + " |УПОРЯДОЧИТЬ ПО | МоментВремени"; Запрос = Новый Запрос(ТекстЗапроса); //параметры запроса - период - текущий месяц Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата())); Запрос.УстановитьПараметр("ОкончаниеПериода", КонецМесяца(ТекущаяДата())); //в нашем примере просто покажем результат пользователю //аккуратно - если в базе много документов, то показ результатов займет много времени Запрос.Выполнить().Выгрузить().ВыбратьСтроку(); Страница 62 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Метаданные объекта Большинство объектов 1С, сохраняемых в базе данных (справочники, документы и т.д.) представлены ссылками и объектами (подробнее см. «Ссылки и объекты»). У ссылок и объектов есть метод .Метаданные(), который позволяет выйти на метаданные этого объекта. Пример – проверка на наличие реквизитов с типом «Справочник.Организация» в документе и обнуление значения этих реквизитов: //ДокументОбъект - документ, полученный на изменение или создание //аналогичным образом можно работать со ссылками, например: ДокументСсылка = Документ.ИмяДокумента.ПустаяСсылка().Метаданные() ДокументОбъект = Документы.ПоступлениеТоваров.СоздатьДокумент(); //цикл по реквизитам Для каждого Реквизит из ДокументОбъект.Метаданные().Реквизиты Цикл //у каждого реквизита может быть как один, так и несколько типов, подробнее см. "ОписаниеТипов" мТипов = Реквизит.Тип.Типы(); //проверяем по каждому типу - тот ли это нужный нам? Для каждого Тип из мТипов Цикл Если Тип = Тип("СправочникСсылка.Организации") Тогда //обнуляем реквизит с этим именем в документе //для "обнуления" можно приравнивать его к Неопределено, //по факту значение будет установлено не Неопределено, а "пустое значение" типа реквизита //Неопределено только если у реквизита несколько типов ДокументОбъект[Реквизит.Имя] = Неопределено; КонецЕсли; КонецЦикла; КонецЦикла; //цикл по табличным частям Страница 63 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Для каждого ТабЧасть из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл //в табличной части тоже реквизиты (колонки таб.части) Для каждого Реквизит из ТабЧасть.Реквизиты Цикл //здесь аналогично мТипов = Реквизит.Тип.Типы(); Для каждого Тип из мТипов Цикл Если Тип = Тип("СправочникСсылка.Организации") Тогда //так как это таб.часть, то мы должны пройтись по всем строкам этой тач. части Для каждого Строка из ДокументОбъект[ТабЧасть.Имя] Цикл Строка[Реквизит.Имя] = Неопределено; КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; Страница 64 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Работа с файлами Работа с файлами в 1С производится с помощью различных объектов, а не универсального «файл». Объекты узкоспециализированы по типам файлов – текстовый, картинки, XML, «двоичный». Основные объекты работы с файлами: ДиалогВыбораФайла Вызов стандартного окна Windows для выбора файла (на открытие или на сохранение). Файл (и общие функции работы с файловой системой) Работа с файловой системой (свойства файла, поиск файлов, работа с каталогами). ЧтениеТекста, ЗаписьТекста, ЗначениеВФайл Чтение и запись текстовых файлов. ЧтениеXML, ЗаписьXML, ЧтениеFastInfoset, ЗаписьFastInfoset, ЧтениеHTML, ЗаписьHTML Чтение и запись XML файлов последовательно (для текстового XML/HTML и бинарного XML). ПостроительDOM, ЗаписьDOM Чтение и запись XML/HTML в объектном виде (в виде «дерева»). Страница 65 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Картинка Чтение изображений из файлов для использования в 1С (отображение, сохранение в базе данных). ДвоичныеДанные, Base64Строка, Base64Значение Чтение и запись бинарных файлов, кодирование двоичных данных в строковый вид и обратно. Подробно про работу с этими объектами можно прочитать в книге «Как стать программистом 1С. Дополнительные объекты языка 1С 8.3». Сейчас мы рассмотрим основные приемы работы с файлами. Особенности работы с файлами клиент-сервер Сервер На сервере возможно использовать неинтерфейсные объекты – чтение/запись файлов (диалог выбора файла используется на клиенте). Файл можно передать с клиента на сервер во временное хранилище сервера или использовать расшаренную папку в сети, к которой есть доступ у пользователя, от имени которого работает сервер 1С. Толстый и тонкий клиент Все объекты работы с файлами доступны в полном объеме в толстом клиенте. Также на клиенте доступен каталог временных файлов (на компьютере где запущен клиент). Страница 66 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Веб клиент В веб клиенте работа с файлами производится на сервере. Также дополнительно перед началом работы требуется подключить/установить расширение работы с файлами. Конфигурации тонкого клиента В конфигурациях для тонкого клиента обычно есть общий модуль «РаботаСФайламиКлиент» (использует справочник «Файлы»), который содержит библиотеку функций работы с файлами на высоком уровне. ДиалогВыбораФайла Объект ДиалогВыбораФайла выводит пользователю стандартный диалог Windows для выбора каталога или файла (на открытие/запись). При этом можно указать фильтр расширений, которые можно использовать пользователю. Например, выбор каталога: //Открываем стандартный диалог Windows выбора каталога/файла в режиме выбора каталога Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); //Если пользователь не нажал кнопку ОТМЕНА в диалоге Если Диалог.Выбрать() Тогда ИмяКаталога = Диалог.Каталог; КонецЕсли; Сообщить(ИмяКаталога); Страница 67 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] При выборе каталога имя каталога возвращается без слэш «\», кроме начала диска, например: С:\ C:\ИмяКаталога Например, выбор имени файла на сохранение txt файла (отличается от режима «выбор файла на открытие» тем, что если выбран существующий файл – будет задан вопрос – действительно ли желаете перезаписать файл?): //Открываем стандартный диалог Windows выбора каталога/файла в режиме выбора файла на сохранение Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); //каталог по-умолчанию, можно не указывать Диалог.Каталог = "C:\"; //фильтр для одного вида файлов, для нескольких – см. следующий пример Диалог.Фильтр = "Текстовый файл (*.txt)|*.txt|"; //Если пользователь не нажал кнопку ОТМЕНА в диалоге Если Диалог.Выбрать() Тогда //Полное имя файла – с учетом «пути к нему» (имени каталога к нему) ИмяФайла = Диалог.ПолноеИмяФайла; КонецЕсли; Сообщить(ИмяФайла); При выборе имени файла полное имя файла содержит «путь к нему», например: C:\ИмяКаталога\ИмяФайла.txt Например, выбор имени файла на открытие файла Excel: //Открываем стандартный диалог Windows выбора каталога/файла в режиме выбора файла на открытие Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; Страница 68 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //Если пользователь не нажал кнопку ОТМЕНА в диалоге Если Диалог.Выбрать() Тогда ИмяФайла = Диалог.ПолноеИмяФайла; КонецЕсли; Сообщить(ИмяФайла); При выборе имени файла полное имя файла содержит «путь к нему». Если пользователь ввел имя файла без расширения, то будет подставлено расширение, указанное первым в списке из нескольких видов в фильтре, например: C:\ИмяКаталога\ИмяФайла.xls Фильтр (например, «Документ *.xlsx)|*.xls;*.xlsx|») состоит: Excel (*.xls, Документ Excel (*.xls, *.xlsx) - произвольная строка для пользователя )|*.xls;*.xlsx| - собственно фильтр, «*» означает любое имя файла, через точку указывается возможное расширение, через «;» можно указать несколько расширений. КаталогВременныхФайлов, ПолучитьИмяВременногоФайла Функция КаталогВременныхФайлов() возвращает путь к собственному каталогу временных файлов 1С на клиентской или серверной машине (зависит от места выполнения функции, подробнее см. «Режим исполнения»). Функция ПолучитьИмяВременногоФайла() возвращает уникальное имя временного файла в собственном каталоге временных файлов 1С (файл при этом автоматически не создается, гарантия что файл с таким именем в этом каталоге отсутствует). Например: Выполняем КаталогВременныхФайлов() Страница 69 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] 1С возвращает "C:\Users\ИмяПользователяWindows\AppData\Local\Temp\" Выполняем ПолучитьИмяВременногоФайла() 1С возвращает "C:\Users\ИмяПользователяWindows\AppData\Local\Temp\v8_F22B _c.tmp" Если требуется, чтобы временный файл был созздан с нужным расширением, то: Выполняем ПолучитьИмяВременногоФайла("txt") 1С возвращает "C:\Users\ИмяПользователяWindows\AppData\Local\Temp\v8_F22B _11.txt" Данные функции используются когда требуется сохранить информацию в файл в служебных целях, а также при работе с файлами через сеть (сначала сохраняем копию локально, а потом уже производим чтение). ПодключитьРасширениеРаботыСФайлами, УстановитьРасширениеРаботыСФайлами, ПолучитьФайл, ПоместитьФайл, ПолучитьФайлы, ПоместитьФайлы, ПолучитьИзВременногоХранилища, ПоместитьВоВременноеХранилище В веб-клиенте работа с файлами (чтение/запись) производится только на сервере. Функция ПодключитьРасширениеРаботыСФайлами() используется в вебклиенте для включения разрешения работы с файлами (поддерживают не все браузеры), если неудачно – возвращает Ложь. Перед первым использованием функции в этом браузере на этом комьютере требуется установить расширение работы с файлами с помощью функции УстановитьРасширениеРаботыСФайлами() Функции ПоместитьФайл(АдресКудаПомещен, ИмяФайла) ПолучитьФайл(АдресОткуда) Страница 70 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ПоместитьФайлы(МассивИменФайлов, МассивАдресовКудаПомещены) ПолучитьФайлы(МассивАдресовОткуда) позволяют передвать файлы между клиентом и сервером. Функции и ПоместитьВоВременноеХранилище() позволяют получить данные файла из временного хранилища сервера, куда они были помещены с помощью ПолучитьФайл() и ПоместитьФайл(). ПолучитьИзВременногоХранилища() На клиенте файлы располагаются где требуется в файловой системе. На сервере файлы помещаются в «хранилище» временный каталог файлов сервера 1С. Напрямую с хранилищем работать нельзя – требуется получить значение из хранилища с помощью функции ПолучитьИзВременногоХранилища() и сохранить во временный файл на сервере с помощью функции ПолучитьИмяВременногоФайла() Данные функции можно использовать не только в веб-клиенте, но и в остальных клиентах для оптимизации работы с файлами. При использовании данных функций в веб-клиенте необходимо заранее выполнить функцию ПодключитьРасширениеРаботыСФайлами() Обратите внимание на различные варианты поведения системы при выполнения данных функций. В некоторых браузерах выполнение кода программы прерывается до закачки файлов на сервер (например, пользователю выводится окно с процентами закачки файла), а в некоторых – выполнение программы продолжается, а загрузка производится фоново. Для примеров использован текстовый файл на локальной «клиентской» машине по адресу «D:\Текстовый файл.txt» со следующим содержимым: Привет, мир! Конец файла Страница 71 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пример 1. Чтение текстового файла на сервере. Имя файла выбирает пользователь/указывает программист: &НаКлиенте Процедура КнопкаЧтениеФайла(Команда) //для веб-клиента требуется дополнительно подключение расширения работы с файлами #Если ВебКлиент Тогда Результат = ПодключитьРасширениеРаботыСФайлами(); //если подключить не удалось - требуется установить его (в первый раз) Если не Результат Тогда //устанавливаем УстановитьРасширениеРаботыСФайлами(); //если не удалось установить - то повторный вызов подключения будет неудачный Если не ПодключитьРасширениеРаботыСФайлами() Тогда //сообщаем об ошибке и прерываем работу программы ВызватьИсключение "Ошибка. Ваш браузер не поддерживает работу с файлами."; КонецЕсли; КонецЕсли; #КонецЕсли //перемещаем файл на сервер во "внутреннее хранилище сервера" ВнутреннийАдресСервера = ""; //если имя файла выбирает пользователь в стандартном диалоговом окне Windows Результат = ПоместитьФайл(ВнутреннийАдресСервера); //если имя файла указывает программист напрямую //Результат = ПоместитьФайл(ВнутреннийАдресСервера, "D:\Текстовый файл.txt",, Ложь); Если не Результат Тогда ВызватьИсключение "Ошибка. Не удалось передать файл на сервер. Операция прервана."; КонецЕсли; Сообщить(ВнутреннийАдресСервера); //переводим выполнение на сервер вызовом серверной процедуры ЧтениеФайла(ВнутреннийАдресСервера); КонецПроцедуры &НаСервере Страница 72 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Процедура ЧтениеФайла(ВнутреннийАдресСервера) //получаем файл из "временного хранилища сервера" и сохраняем во временный файл на сервере ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ПолучитьИзВременногоХранилища(ВнутреннийАдресСервера).Записа ть(ИмяВременногоФайла); Сообщить(ИмяВременногоФайла); //начинаем работать с файлом //узнаем размер файла в байтах (и переведем размер в мегабайты) Файл = Новый Файл(ИмяВременногоФайла); Сообщить(Строка(Окр(Файл.Размер() /1024 /1024, 2)) + "Мб"); //прочитаем первую строку файла ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла); ТекстПервойСтрокиФайла = ТекстовыйФайл.ПрочитатьСтроку(); Сообщить(ТекстПервойСтрокиФайла); ТекстовыйФайл.Закрыть(); КонецПроцедуры 1с возвращает: e1cib/tempstorage/ad728cdf-fce4-4c50-b348-87d5265a57a6 C:\Users\ИмяПользователяWindows\AppData\Local\Temp\v8_BE51_59.tm p 0Мб Привет, мир! Пример 2. Передача на сервер нескольких файлов. Имена файлов выбирает пользователь/указывает программист: &НаКлиенте Процедура КнопкаЧтениеФайла(Команда) //для веб-клиента требуется дополнительно подключение расширения работы с файлами #Если ВебКлиент Тогда Результат = ПодключитьРасширениеРаботыСФайлами(); //если подключить не удалось - требуется установить его (в первый раз) Если не Результат Тогда //устанавливаем Страница 73 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] УстановитьРасширениеРаботыСФайлами(); //если не удалось установить - то повторный вызов подключения будет неудачный Если не ПодключитьРасширениеРаботыСФайлами() Тогда //сообщаем об ошибке и прерываем работу программы ВызватьИсключение "Ошибка. Ваш браузер не поддерживает работу с файлами."; КонецЕсли; КонецЕсли; #КонецЕсли //перемещаем файл на сервер во "внутреннее хранилище сервера" МассивВнутреннихАдресовСервера = Новый Массив; //если список имен файлов выбирает пользователь Результат = ПоместитьФайлы(,МассивВнутреннихАдресовСервера); //если список имен файлов указывает программист напрямую //МассивВнутреннихАдресовСервера = Новый Массив; //МассивИменФайлов = Новый Массив; //МассивИменФайлов.Добавить(Новый ОписаниеПередаваемогоФайла("D:\Текстовый файл.txt", "")); //Результат = ПоместитьФайлы(МассивИменФайлов, МассивВнутреннихАдресовСервера,, Ложь); Если не Результат или МассивВнутреннихАдресовСервера.Количество() = 0 Тогда ВызватьИсключение "Ошибка. Не удалось передать файл на сервер. Операция прервана."; КонецЕсли; Для каждого ИмяФайла из МассивВнутреннихАдресовСервера Цикл Сообщить(ИмяФайла.Хранение); //переводим выполнение на сервер вызовом серверной процедуры //реализацию этой функции см. в примере 1 ЧтениеФайла(ИмяФайла.Хранение); КонецЦикла; КонецПроцедуры Страница 74 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пример 3. Запись нового файла на сервере с последующей передачей на клиент. Имя файла выбирает пользователь/формирует программист. &НаКлиенте Процедура КнопкаЧтениеФайла(Команда) //для веб-клиента требуется дополнительно подключение расширения работы с файлами #Если ВебКлиент Тогда Результат = ПодключитьРасширениеРаботыСФайлами(); //если подключить не удалось - требуется установить его (в первый раз) Если не Результат Тогда //устанавливаем УстановитьРасширениеРаботыСФайлами(); //если не удалось установить - то повторный вызов подключения будет неудачный Если не ПодключитьРасширениеРаботыСФайлами() Тогда //сообщаем об ошибке и прерываем работу программы ВызватьИсключение "Ошибка. Ваш браузер не поддерживает работу с файлами."; КонецЕсли; КонецЕсли; #КонецЕсли //вызов серверной процедуры формирования файла, она возвращает "внутренний адрес", передаем его параметром //куда сохранил пользователь файл и сохранил ли - мы не знаем //пользователь всегда подтверждает разрешение на получение файла ПолучитьФайл(ФормированиеФайла()); //вариант с сохранением файла без подтверждения пользователя, имя файла указываем сразу, в веб-клиенте работать не будет //ПолучитьФайл(ФормированиеФайла(), "D:\Текстовый файл.txt", Ложь); КонецПроцедуры &НаСервере Функция ФормированиеФайла() //получаем файл из "временного хранилища сервера" и сохраняем во временный файл на сервере ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); Страница 75 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //начинаем работать с файлом //записываем текст в файл ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла); ТекстовыйФайл.ЗаписатьСтроку("Привет, мир!"); ТекстовыйФайл.ЗаписатьСтроку("Конец файла"); ТекстовыйФайл.Закрыть(); //помещаем во "временное хранилище сервера", система вернет "внутренний адрес" Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла)); КонецФункции Пример 4. Передача файла на сервер, изменение и возврат на клиент &НаКлиенте Процедура КнопкаЧтениеФайла(Команда) //для веб-клиента требуется дополнительно подключение расширения работы с файлами #Если ВебКлиент Тогда Результат = ПодключитьРасширениеРаботыСФайлами(); //если подключить не удалось - требуется установить его (в первый раз) Если не Результат Тогда //устанавливаем УстановитьРасширениеРаботыСФайлами(); //если не удалось установить - то повторный вызов подключения будет неудачный Если не ПодключитьРасширениеРаботыСФайлами() Тогда //сообщаем об ошибке и прерываем работу программы ВызватьИсключение "Ошибка. Ваш браузер не поддерживает работу с файлами."; КонецЕсли; КонецЕсли; #КонецЕсли ИмяФайла = "D:\Текстовый файл.txt"; ВнутреннийАдресСервера = ""; Результат = ПоместитьФайл(ВнутреннийАдресСервера, ИмяФайла,, Ложь); Если Результат Тогда Страница 76 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ВнутреннийАдресСервера = ОбработатьФайлНаСервере(ВнутреннийАдресСервера); #Если ВебКлиент Тогда //особенность веб-клиента - запись всегда производится интерактивно (пользователь сам выбирает где сохранить файл) ПолучитьФайл(ВнутреннийАдресСервера, ИмяФайла); #Иначе ПолучитьФайл(ВнутреннийАдресСервера, ИмяФайла, Ложь); #КонецЕсли КонецЕсли; КонецПроцедуры &НаСервере Функция ОбработатьФайлНаСервере(ВнутреннийАдресСервера) //получаем файл из "временного хранилища сервера" и сохраняем во временный файл на сервере ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ПолучитьИзВременногоХранилища(ВнутреннийАдресСервера).Записа ть(ИмяВременногоФайла); //начинаем работать с файлом //читаем текст из файла целиком ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла); Текст = ТекстовыйФайл.Прочитать(); ТекстовыйФайл.Закрыть(); //проводим анализ текста //записываем текст в файл ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла); ТекстовыйФайл.Записать(Текст); ТекстовыйФайл.ЗаписатьСтроку("Добавлено " + Строка(ТекущаяДата())); ТекстовыйФайл.Закрыть(); //помещаем во "временное хранилище сервера", система вернет "внутренний адрес" Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла)); КонецФункции Страница 77 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Файл Объект Файл позволяет: получить путь к файлу (каталог без имени файла), имя без расширения, только расширение проверить наличие файла определить файл это или каталог получить размер файла работать с атрибутами файла (время измененеия, только чтение, скрытые файлы). Примеры: Функция ПолучитьКаталогПоИмениФайла(ИмяФайла) //обращаемся к файлу, на этот момент существование файла не проверяется Файл = Новый Файл(ИмяФайла); //напрямую проверяем существование Если не Файл.Существует() Тогда Сообщить("Ошибка. Файл с именем '" + ИмяФайла + "' не существует"); Возврат ИмяФайла; КонецЕсли; //проверка на каталог Если Файл.ЭтоКаталог() Тогда //если последняя буква не "\", то добавляем ее Возврат ?(Прав(СокрП(ИмяФайла), 1) = "\", ИмяФайла, СокрП(ИмяФайла) + "\"); КонецЕсли; //возвращаем путь (т.е. только каталог из имени файла) Возврат Файл.Путь; КонецФункции Функция ФайлМожноЗаписывать(ИмяФайла) //обращаемся к файлу, на этот момент существование файла не проверяется Файл = Новый Файл(ИмяФайла); //напрямую проверяем существование Страница 78 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Если не Файл.Существует() Тогда Сообщить("Ошибка. Файл с именем '" + ИмяФайла + "' не существует"); Возврат ИмяФайла; КонецЕсли; //вернет ИСТИНА, если нельзя записывать (т.е. только чтение "установлен") Если Файл.ПолучитьТолькоЧтение() Тогда Попытка Файл.УстановитьТолькоЧтение(Ложь); Исключение //здесь мы окажемся, если у пользователя, под которым работает клиент 1С нет прав снять этот реквизит Возврат Ложь; КонецПопытки; КонецЕсли; Возврат Истина; КонецФункции //Варианты единицы измерения: // М - МегаБайты // К - КилоБайты // Б - Байты Функция ПолучитьРазмерФайла(ИмяФайла, ЕдиницаИзмерения = "М") //обращаемся к файлу, на этот момент существование файла не проверяется Файл = Новый Файл(ИмяФайла); //напрямую проверяем существование Если не Файл.Существует() Тогда Сообщить("Ошибка. Файл с именем '" + ИмяФайла + "' не существует"); Возврат ИмяФайла; КонецЕсли; Если ЕдиницаИзмерения = "М" Тогда Возврат Окр(Файл.Размер() /1024 /1024, 2); ИначеЕсли ЕдиницаИзмерения = "К" Тогда Возврат Окр(Файл.Размер() /1024, 2); КонецЕсли; Возврат Файл.Размер(); КонецФункции Страница 79 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Функции работы с файловой системой Следующие функции позволяют манипулировать файлами: СоздатьКаталог НайтиФайлы КопироватьФайл ПереместитьФайл УдалитьФайлы РазделитьФайл ОбъединитьФайлы. Пример – работа с каталогами: //создает недостающие каталоги в указанном пути //если каталога нет – создаст всю вложенную структуру //если есть D:\Temp, то создаст подкаталоги СоздатьКаталог("D:\Temp\1\2\3") Пример – поиск файлов: //найти все файлы в каталоге «Sc» НайденныеФайлы = НайтиФайлы("D:\Sc", "*"); //найти все ТЕКСТОВЫЕ файлы в каталоге, включая вложенные подкаталоги НайденныеФайлы = НайтиФайлы("D:\Sc", "*.txt", Истина); //найти все файлы в каталоге, в имени которых встречается слово "копия" НайденныеФайлы = НайтиФайлы("D:\Sc", "*копия*"); //найти все файлы в каталоге, в имени которых встречается любая цифра в скобочках, например "(1)" или "(100)" НайденныеФайлы = НайтиФайлы("D:\Sc", "*(*)*"); //найти все файлы в каталоге, в имени которых встречается цифра в скобочках меньше 10, например "(1)" или "(9)" НайденныеФайлы = НайтиФайлы("D:\Sc", "*(?)*"); Для каждого Файл из НайденныеФайлы Цикл Если Файл.ЭтоКаталог() Тогда Продолжить; КонецЕсли; Страница 80 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ИмяФайла = Файл.ПолноеИмя; Сообщить(ИмяФайла); КонецЦикла; Пример – копирование, перемещение и удаление файлов: ИмяФайла = "Текстовый файл.txt"; КаталогИсточник = "D:\sc\"; КаталогПриемник = "D:\"; //копирование файла ФайлИсточник = Новый Файл(КаталогИсточник + ИмяФайла); Если не ФайлИсточник.Существует() или ФайлИсточник.ЭтоКаталог() Тогда ВызватьИсключение "Файл '" + КаталогИсточник + ИмяФайла + "' не существует или является каталогом"; КонецЕсли; Попытка КопироватьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла); Исключение ВызватьИсключение "Нет прав на копирование файла"; КонецПопытки; ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла); Если не ФайлПриемник.Существует() или ФайлПриемник.Размер() <> ФайлИсточник.Размер() Тогда ВызватьИсключение "Не удалось корректно скопировать файл"; КонецЕсли; //перемещение файла Попытка ПереместитьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла); Исключение ВызватьИсключение "Нет прав на копирование файла"; КонецПопытки; ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла); Если не ФайлПриемник.Существует() Тогда ВызватьИсключение "Не удалось корректно перенести файл"; КонецЕсли; Страница 81 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Разделение и слияние файлов: //функция создает каталог с именем файла //в нем создает разделенные части файла, каждая размером в указанное кол-во мегабайт //каждую часть сжимает архиватором //возвращает имя каталога Функция РазделениеФайла(ИмяФайла, МбЧасть) //проверим, что файл существует и он не каталог Файл = Новый Файл(ИмяФайла); Если не Файл.Существует() или Файл.ЭтоКаталог() Тогда ВызватьИсключение "Файл не найден или является каталогом или найдено больше одного файла с указанным именем"; КонецЕсли; //МБЧасть - это требуемый размер части файла в мегабайтах //проверим, что в параметре не забыли указать корректный размер //проверим, что файл больше чем заданный размер, иначе как его разрезать? Если МбЧасть <= 0 или Файл.Размер() <= МбЧасть *1024 *1024 Тогда ВызватьИсключение "Файл не требуется разделять, так как он меньше, чем требуемый размер"; КонецЕсли; //создадим каталог, где имя каталога равно имени файла + ".parts" ИмяКаталога = ВРЕГ(ИмяФайла + ".parts\"); Попытка СоздатьКаталог(ИмяКаталога); Исключение ВызватьИсключение "Нет прав на создание каталога: " + ОписаниеОшибки(); КонецПопытки; //разделим файл на части //имя файла - что делить //второй параметр - размер в байтах каждой части (последняя меньше - по остатку) //имя каталога - где создавать части файла, если не указать - части будут созданы там же, где и файл-источник ИменаЧастейФайла = РазделитьФайл(ИмяФайла, МбЧасть *1024 *1024, ИмяКаталога); //пройдем по частям и заархивируем их Для каждого ИмяЧастиФайла из ИменаЧастейФайла Цикл //первый параметр - имя файла zip Страница 82 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //четвертый и пятый параметры - метод архивации //мы создаем ПУСТОЙ архив Зип = Новый ЗаписьZipФайла(ИмяЧастиФайла + ".zip",,, МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный); //теперь в пустой архив добавляем файл - одну часть файла Зип.Добавить(ИмяЧастиФайла); //записываем архив и закрываем Зип.Записать(); //файл части удаляем, оставим только созданный архив УдалитьФайлы(ИмяЧастиФайла); КонецЦикла; Сообщить("Разделение файла завершено"); Возврат ИмяКаталога; КонецФункции //функция обратная разделению - разархивирует части файла, производит слияние в файл с именем каталога //возвращает имя файла Функция СлияниеФайла(ИмяКаталога) //проверим, что каталог с таким именем есть и является каталогом Файл = Новый Файл(ИмяКаталога); Если не Файл.Существует() или не Файл.ЭтоКаталог() Тогда ВызватьИсключение "Каталог не найден или не является каталогом"; КонецЕсли; //в каталоге найдем все файлы с расширением zip //аккуратно - мы не проверяем их наименование, допущение, что каталог с файлами создан предыдущим методом мЧастейФайла = НайтиФайлы(?(Прав(СокрП(ИмяКаталога), 1) = "\", ИмяКаталога, ИмяКаталога + "\"), "*.zip"); Если мЧастейФайла.Количество() < 2 Тогда ВызватьИсключение "В каталоге отсутствуют zip файлы или их количество менее двух"; КонецЕсли; //все имена добавим в список значений, чтобы отсортировать в верном порядке (допущение то же, что и в предыдущей строке) спЧастейФайла = Новый СписокЗначений(); Для каждого ИмяЧастиФайла из мЧастейФайла Цикл спЧастейФайла.Добавить(ИмяЧастиФайла.ПолноеИмя); КонецЦикла; спЧастейФайла.СортироватьПоЗначению(); Страница 83 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //мы будем разархивировать части файла из архива, сохраним их имена в массив, чтобы удалить после объединения мФайловДляУдаления = Новый Массив(); //идем в цикле по списку найденных заархивированных частей файла Для каждого ЧастьФайла из спЧастейФайла Цикл //параметр архиватора - имя файла с заархивированной частью файла Зип = Новый ЧтениеZipФайла(ЧастьФайла.Значение); //каждый архив содержит от одного до нескольких файлов ("элементов"), проверим что архив не пустой Если Зип.Элементы.Количество() = 0 Тогда ВызватьИсключение "Ошибка. Файл '" + Файл.Значение + "' некорректный zip файл."; КонецЕсли; //убираем из имени архива части файла расширение zip должно остатся то имя, которое было до архивации ЧастьФайла.Значение = СтрЗаменить(ВРЕГ(ЧастьФайла.Значение), ".ZIP", ""); //извлекаем файлы из архива //первый параметр - файл в архиве ("элемент архива") //второй параметр - имя файла, в который будем разархивировать Зип.Извлечь(Зип.Элементы[0], ЧастьФайла.Значение); //разархивированный файл нужно будет удалить, сохраним имя файла в массив мФайловДляУдаления.Добавить(ЧастьФайла.Значение); //запомним фактическое имя разархивированного файла ЧастьФайла.Значение = ЧастьФайла.Значение + "\" + Зип.Элементы[0].Имя; КонецЦикла; //имя файла, в который будем производить объединение ИмяФайла = Файл.Путь + Файл.ИмяБезРасширения; //производим объединение //первый параметр - массив имен файлов (полных имен, с каталогом) //второй параметр - имя конечного файла, в которой производится объединение Попытка ОбъединитьФайлы(спЧастейФайла.ВыгрузитьЗначения(), ИмяФайла); Исключение ВызватьИсключение "Ошибка объединения файлов: " + ОписаниеОшибки(); КонецПопытки; //удалим разархивированные части, чтобы осталось "все как было" Страница 84 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Для каждого ИмяЧастиФайла из мФайловДляУдаления Цикл УдалитьФайлы(ИмяЧастиФайла); КонецЦикла; Сообщить("Объединение файла завершено"); КонецФункции ЧтениеТекста, ЗначениеИзФайла ЗаписьТекста, ЗначениеВФайл, Для работы с текстовыми файлами предназначены объекты ЧтениеТекста и ЗаписьТекста. Функция ЗначениеВФайл() позволяет быстро и просто сохранить в текстовый файл «любое» значение 1С, в том числе такие объекты как таблица значений и прочие. Пример чтения текстового файла (про строки и работу с символами переноса строки см. подробнее «Работа со строками»): Пример 1. Чтение текстового файла целиком (в одну «строку с переносами») Файл = Новый ЧтениеТекста("D:\Текстовый файл.txt"); ВесьФайлОднойСтрокой = Файл.Прочитать(); Файл.Закрыть(); Пример 2. Чтение текстового файла построчно (в данном примере в массив строк) мСтрокФайла = Новый Массив(); Файл = Новый ЧтениеТекста("D:\Текстовый файл.txt"); //прочитать строку считывает одну строку из файла //если достигнут конец файла, то возвращается значение НЕОПРЕДЕЛЕНО Строка = Файл.ПрочитатьСтроку(); //а не был ли файл пуст? Если Строка <> Неопределено Тогда мСтрокФайла.Добавить(Строка); КонецЕсли; //цикл пока чтение строки не вернет НЕОПРЕДЕЛЕНО //внутри цикла повторяем чтение Страница 85 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пока Строка <> Неопределено Цикл Строка = Файл.ПрочитатьСтроку(); Если Строка <> Неопределено Тогда мСтрокФайла.Добавить(Строка); КонецЕсли; КонецЦикла; Файл.Закрыть(); Пример 3. Запись текстового файла (пример – формирование xml файла текстом) //создаем файл Файл = Новый ЗаписьТекста("D:\Текстовый файл.txt"); Файл.ЗаписатьСтроку("<Конфигурация>"); //по метаданным обходим все справочники (подробнее см. "Работа с метаданными") Для каждого Справочник из Метаданные.Справочники Цикл Файл.ЗаписатьСтроку(" <Справочник Имя=""" + Справочник.Имя + """ Синоним=""" + Справочник.Синоним + """>"); //по метаданным обходим все реквизиты справочника Для каждого Реквизит из Справочник.Реквизиты Цикл Файл.ЗаписатьСтроку(" <Реквизит Имя=""" + Реквизит.Имя + """ Синоним=""" + Реквизит.Синоним + """ />"); КонецЦикла; //по метаданным обходим все табличные части справочника Для каждого ТабЧасть из Справочник.ТабличныеЧасти Цикл Файл.ЗаписатьСтроку(" <ТабличнаяЧасть Имя=""" + ТабЧасть.Имя + """ Синоним=""" + ТабЧасть.Синоним + """>"); //по метаданным обходим все реквизиты текущей табличной части Для каждого Реквизит из ТабЧасть.Реквизиты Цикл Файл.ЗаписатьСтроку(" <Реквизит Имя=""" + Реквизит.Имя + """ Синоним=""" + Реквизит.Синоним + """ />"); КонецЦикла; Файл.ЗаписатьСтроку(" </ТабличнаяЧасть>"); КонецЦикла; Файл.ЗаписатьСтроку(" КонецЦикла; </Справочник>"); Файл.ЗаписатьСтроку("</Конфигурация>"); Файл.Закрыть(); Страница 86 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Получившийся файл: <Конфигурация> <Справочник Имя="Организации" Синоним="Организации"> </Справочник> <Справочник Имя="Контрагенты" Синоним="Контрагенты"> </Справочник> <Справочник Имя="ДоговорыКонтрагентов" Синоним="Договоры контрагентов"> <Реквизит Имя="Организация" Синоним="Организация" /> </Справочник> </Конфигурация> Пример 4. Сохранение значения 1С в файл //запросом выбираем все документы поступления товара Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Документ.ПоступлениеТоваров"); //Запрос.Выполнить().Выгрузить() - выгружает в таблицу значений все выбранные запросом документы //ЗначениеВФайл - сохраняет таблицу значений в файл ЗначениеВФайл("D:\Текстовый файл.txt", Запрос.Выполнить().Выгрузить()); //ЗначениеИзФайла - считывает значение из файла обратно, в то значение, которое было сохранено, в данном случае в таблицу значений //если выполнить этот код в другой базе, то ссылки на объекты не сохранятся, а простые типы данных (строка, число, дата, булево) - сохраняться //вариант - проходить таблицу перед сохранением в цикле, заменяя все ссылочные значения на простые типы (подробнее см. "Работа с типами") тЗначений = ЗначениеИзФайла("D:\Текстовый файл.txt"); тЗначений.ВыбратьСтроку(); Пример содержимого получившегося файла (для данного примера): {"#",acf6192e-81ca-46ef-93a6-5a6968b78663, {9, {10, {0,"Ссылка", {"Pattern", {"#",0042d8c9-e8d0-4982-82c4-ba72852906b8}, {"L"} },"Ссылка",25}, Страница 87 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] {1,"ВерсияДанных", {"Pattern", {"S",12,0}, {"L"} },"ВерсияДанных",12}, ЧтениеXML, ЗаписьXML, ЧтениеFastInfoset, ЗаписьFastInfoset, ЧтениеHTML, ЗаписьHTML XML - текстовые файлы, позволяющие с помощью специальной разметки сохранять сложные данные в структурированном виде. FastInfoset - XML файл в бинарном («сжатом») виде. HTML - всем известные веб-страницы, которые также представляют из себя аналог XML с нестрогими проверками. Объекты чтения/записи XML, FastInfoset, HTML расширяют возможности чтения текстового файла встроенной обработкой тегов разметки. Также они используются для объектов ПостроительDOM/ЗаписьDOM (см. далее) как источники данных. Файл XML, который использовался в примерах: <Конфигурация> <Справочник Имя="Организации" Синоним="Организации"> </Справочник> <Справочник Имя="Контрагенты" Синоним="Контрагенты"> <Реквизит Имя="Организация12" Синоним="Организация" /> </Справочник> <Справочник Имя="ДоговорыКонтрагентов" Синоним="Договоры контрагентов"> <Реквизит Имя="Организация" Синоним="Организация">Текстовое значение</Реквизит> </Справочник> </Конфигурация> Страница 88 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пример 1. Считывание XML в дерево значений //открываем файл XML на чтение Файл = Новый ЧтениеXML(); Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml"); //подготовим дерево значений //у каждой ветки XML может быть наименование, атрибуты и значение дзXML = Новый ДеревоЗначений(); дзXML.Колонки.Добавить("Наименование"); дзXML.Колонки.Добавить("Значение"); дзXML.Колонки.Добавить("Атрибуты"); //так как атрибутов у строки XML может быть несколько - будем записывать их в таблицу значений //каждый атрибут имеет имя и значение тАтрибутов = Новый ТаблицаЗначений(); тАтрибутов.Колонки.Добавить("Имя"); тАтрибутов.Колонки.Добавить("Значение"); //уровень вложенности поможет нам понимать когда требуется добавить вложенную ветку, а когда нужно вернуться на уровень вверх УровеньВложенности = 0; //текущая строка - строка дерева, будет меняться при увеличении вложенности ТекущаяСтрока = Неопределено; //чтение файла XML производится не построчно, а по структуре, при окончании файла чтение вернет ЛОЖЬ Пока Файл.Прочитать() Цикл //нас интересуют три вида узлов - начало элемента, текст (значение элемента) и конец элемента (чтобы вернуться на уровень вверх) Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем УровеньВложенности = УровеньВложенности + 1; //если это первая строка, то добавим ее в самый верх дерева и сохраним только наименование Если ТекущаяСтрока = Неопределено Тогда ТекущаяСтрока = дзXML.Строки.Добавить(); ТекущаяСтрока.Наименование = Файл.Имя; Продолжить; Иначе //вложенные строки ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить(); Страница 89 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ТекущаяСтрока.Наименование = Файл.Имя; //сохраним наименование //есть ли у этого элемента XML атрибуты? Если Файл.КоличествоАтрибутов() > 0 Тогда //если да - скопируем подготовленную пустую таблицу для сохранения атрибутов тАтрибутыУзла = тАтрибутов.Скопировать(); //цикл по количеству атрибутов у этого элемента Для Сч = 0 по Файл.КоличествоАтрибутов()-1 Цикл //для каждого атрибута запомним имя и значение Строка = тАтрибутыУзла.Добавить(); Строка.Имя = Файл.ИмяАтрибута(Сч); Строка.Значение = Файл.ЗначениеАтрибута(Сч); КонецЦикла; //сохраним таблицу атрибутов элемента в текущую строку ТекущаяСтрока.Атрибуты = тАтрибутыУзла; КонецЕсли; КонецЕсли; ИначеЕсли Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем УровеньВложенности = УровеньВложенности - 1; //возвращаем текущую строку на уровень вверх ТекущаяСтрока = ТекущаяСтрока.Родитель; ИначеЕсли Файл.ТипУзла = ТипУзлаXML.Текст Тогда //если у элемента есть значение - просто сохраним его ТекущаяСтрока.Значение = Файл.Значение; КонецЕсли; КонецЦикла; Файл.Закрыть(); Страница 90 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Пример 2. Запись XML с помощью объекта ЗаписьXML //создаем файл Файл = Новый ЗаписьXML(); Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml", "UTF-8"); Файл.ЗаписатьНачалоЭлемента("Конфигурация"); //по метаданным обходим все справочники (подробнее см. "Работа с метаданными") Для каждого Справочник из Метаданные.Справочники Цикл //ЗаписатьНачалоЭлемента - открывает новую [подчиненную] ветку Файл.ЗаписатьНачалоЭлемента("Справочник"); //ЗаписатьАтрибут - записывает атрибут в открытую ранее ветку Файл.ЗаписатьАтрибут("Имя", Справочник.Имя); Файл.ЗаписатьАтрибут("Синоним", Справочник.Синоним); //по метаданным обходим все реквизиты справочника Для каждого Реквизит из Справочник.Реквизиты Цикл Файл.ЗаписатьНачалоЭлемента("Реквизит"); Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя); Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним); Файл.ЗаписатьКонецЭлемента(); КонецЦикла; //по метаданным обходим все табличные части справочника Для каждого ТЧ из Справочник.ТабличныеЧасти Цикл Файл.ЗаписатьНачалоЭлемента("ТабличнаяЧасть"); Файл.ЗаписатьАтрибут("Имя", ТЧ.Имя); Файл.ЗаписатьАтрибут("Синоним", ТЧ.Синоним); Для каждого Реквизит из ТЧ.Реквизиты Цикл Файл.ЗаписатьНачалоЭлемента("Реквизит"); Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя); Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним); Файл.ЗаписатьКонецЭлемента(); КонецЦикла; Файл.ЗаписатьКонецЭлемента(); КонецЦикла; //ЗаписатьКонецЭлемента - "закрывает" открытую ранее с помощью ЗаписатьНачалоЭлемента ветку Файл.ЗаписатьКонецЭлемента(); КонецЦикла; Файл.ЗаписатьКонецЭлемента(); Файл.Закрыть(); Страница 91 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] ПостроительDOM, ЗаписьDOM ДокументDOM – объект, который позволяет работать с XML файлом в «объектной» оболочке. Поддерживается массив (список) узлов, подчиненные узлы, поиск и т.п. ПостроительDOM ДокументDOM. – позволяет считывать XML в объект ЗаписьDOM – позволяет записать ДокументDOM в файл XML. Пример 1 – создание документа XML и последующая запись в файл: //создаем объект XML документа XML = Новый ДокументDOM("http://howknow1c.ru/demo/configxml", "Конфигурация"); //по метаданным обходим все справочники (подробнее см. "Работа с метаданными") Для каждого Справочник из Метаданные.Справочники Цикл //создаем элемент и указываем у него 2 атрибута элСправочник = XML.СоздатьЭлемент("Справочник"); элСправочник.УстановитьАтрибут("Имя", Справочник.Имя); элСправочник.УстановитьАтрибут("Синоним", Справочник.Синоним); //по метаданным обходим все реквизиты справочника Для каждого Реквизит из Справочник.Реквизиты Цикл //создаем элемент и указываем у него 2 атрибута элРеквизит = XML.СоздатьЭлемент("Реквизит"); элРеквизит.УстановитьАтрибут("Имя", Реквизит.Имя); элРеквизит.УстановитьАтрибут("Синоним", Реквизит.Синоним); //добавляем в список подчиненных элементов узла "Справочник", созданный элемент элСправочник.ДобавитьДочерний(элРеквизит); КонецЦикла; //по метаданным обходим все табличные части справочника Для каждого ТЧ из Справочник.ТабличныеЧасти Цикл элТч = XML.СоздатьЭлемент("ТабличнаяЧасть"); элТч.УстановитьАтрибут("Имя", ТЧ.Имя); элТч.УстановитьАтрибут("Синоним", ТЧ.Синоним); Страница 92 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Для каждого Реквизит из ТЧ.Реквизиты Цикл элРеквизит = XML.СоздатьЭлемент("Реквизит"); элРеквизит.УстановитьАтрибут("Имя", Реквизит.Имя); элРеквизит.УстановитьАтрибут("Синоним", Реквизит.Синоним); элТч.ДобавитьДочерний(элРеквизит); КонецЦикла; элСправочник.ДобавитьДочерний(элТч); КонецЦикла; //"ЭлементДокумента" - корневой узел XML документа //добавляем в список подчиненных элементов корневого узла созданный ранее элемент XML.ЭлементДокумента.ДобавитьДочерний(элСправочник); КонецЦикла; //отдельно - операция записи созданного XML документа //ЗаписьXML - структурированная запись XML файла Файл = Новый ЗаписьXML(); Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml", "UTF-8"); //ЗаписьDOM - способ конвертировать созданный ранее XML документ для записи ФайлDOM = Новый ЗаписьDOM(); //производим запись ФайлDOM.Записать(XML, Файл); //закрываем файл Файл.Закрыть(); Пример 2 – чтение XML из файла и последующая обработка списка узлов в цикле по порядку: //Считываем файл в объект ДокументXML Файл = Новый ЧтениеXML(); Файл.ОткрытьФайл("D:\sc\СтруктураКонфигурации.xml"); ФайлDOM = Новый ПостроительDOM(); XML = ФайлDOM.Прочитать(Файл); //"ЭлементДокумента" - это корневой узел файла XML //ДочерниеУзлы - это список (массив) дочерних узлов у любого узла XML документа //В нашем файле сначала идет список "Справочник" Для каждого элСправочник из XML.ЭлементДокумента.ДочерниеУзлы Цикл Сообщить("Справочник " + элСправочник.Атрибуты.ПолучитьИменованныйЭлемент("Имя").Значение Узла); Страница 93 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] //У каждого справочника внутри список "Реквизит" Для каждого элРеквизит из элСправочник.ДочерниеУзлы Цикл Сообщить(" реквизит " + элРеквизит.Атрибуты.ПолучитьИменованныйЭлемент("Имя").ЗначениеУз ла); КонецЦикла; КонецЦикла; Пример 3 – чтение XML из файла и последующая обработка узлов с помощью поиска: //Считываем файл в объект ДокументXML Файл = Новый ЧтениеXML(); Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml"); ФайлDOM = Новый ПостроительDOM(); XML = ФайлDOM.Прочитать(Файл); //в нашем XML сначала идет узел "Справочник", вложенные узлы "Реквизит" или сначала "Табличная часть", а в нее вложены узлы "Реквизит" //ПолучитьЭлементыПоИмени() выдаст нам список всех узлов "Реквизит", вне зависимости от их уровня вложенности спСправочников = XML.ПолучитьЭлементыПоИмени("Реквизит"); //цикл по списку найденных узлов Для Сч = 0 По спСправочников.Количество()-1 Цикл //получаем соответствующий узел элXML = спСправочников[Сч]; //с помощью свойства .РодительскийУзел определим на каком уровне вложенности мы оказались //.ИмяУзла позволит нам узнать имя узла "Справочник", "ТабличнаяЧасть" или "Реквизит" Если спСправочников[Сч].РодительскийУзел.ИмяУзла = "Справочник" Тогда ИмяСправочника = элXML.РодительскийУзел.Атрибуты.ПолучитьИменованныйЭлемент("Имя" ).ЗначениеУзла; ИмяТч = ""; Иначе ИмяСправочника = элXML.РодительскийУзел.РодительскийУзел.Атрибуты.ПолучитьИменова нныйЭлемент("Имя").ЗначениеУзла; ИмяТч = элXML.РодительскийУзел.Атрибуты.ПолучитьИменованныйЭлемент("Имя" ).ЗначениеУзла; Страница 94 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] КонецЕсли; ИмяРеквизита = элXML.Атрибуты.ПолучитьИменованныйЭлемент("Имя").ЗначениеУзла; Сообщить("Справочник: " + ИмяСправочника + ?(ПустаяСтрока(ИмяТч), "", ", таб.часть " + ИмяТч) + ", реквизит " + ИмяРеквизита); КонецЦикла; Обратите внимание – для поиска элементов внутри документа DOM мы используем метод ПолучитьЭлементыПоИмени(), которая позволяет искать узлы по одному указанному имени: спНайденныхЭлементов = XML.ПолучитьЭлементыПоИмени("Реквизит"); Также в 1С доступен язык выражений XPath, который позволяет указывать гораздо более продвинутые условия поиска: спЭлементов = XML.ВычислитьВыражениеXPath("//Реквизит", XML, Новый РазыменовательПространствИменDOM(XML)); Простые варианты использования XPath: /Узел1/Узел2 – поиск всех узлов «Узел2», вложенных в «Узел1», при этом «Узел1» является корневым в файле //Узел1/Узел2 – аналогично предыдущему, но теперь «Узел1» может быть не корневым и находится на любом вложенном уровне /Узел1/* - поиск всех подчиненных элементов узла «Узел1». Страница 95 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Картинка Картинка – объект языка 1С, который позволяет считать картинку из файла. Далее ее можно: использовать в интерфейсе (вывести пользователю на форму) записать в базу данных (с помощью объекта ХранилищеЗначения, см. ранее) преобразовать в «двоичные данные». Также тип «Картинка» имеют все картинки, которые находятся в библиотеке стандартных картинок и картинок конфигурации: БиблиотекаКартинок.ИмяКартинки.Записать("D:\picture.jpg"); Чтение картинки из файла: ЭлементыФормы.ПолеКартинки1.Картинка = Новый Картинка("D:\picture.jpg"); Сохранение картинки в базу данных: Картинка = Новый Картинка("D:\picture.jpg"); СправочникСсылка.ХранилищеКартинки = Новый ХранилищеЗначения(Картинка.ПолучитьДвоичныеДанные(), Новый СжатиеДанных(9)); ДвоичныеДанные, Base64Строка, Base64Значение ДвоичныеДанные – это объект, который позволяет работать с файлами произвольного формата («бинарные»). Собственно «обработать» содержимое бинарного файла в 1С нельзя, его можно сохранить в базу (или из базы в файл), использовать в различных механизмах (например, как почтовое вложение), Страница 96 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] перекодировать данные файла в строку по алгоритму Base64 (текстовое представление бинарных данных). Например, сохранение бинарного файла в базу: СправочникСсылка.ХранилищеКартинки = Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\SomeFile.exe"), Новый СжатиеДанных(9)); Пример кодирования Base64 текстового файла «как бинарного» (содержимое файла - строчка «Привет!»): Сообщить(Base64Строка(Новый ДвоичныеДанные("D:\Файл.xml"))); Результат кодирования: z/Do4uXyIQ== Результат раскодирования (объект ДвоичныеДанные, который можно сохранить в бинарный файл): Сообщить(Base64Значение("z/Do4uXyIQ==")); CF F0 E8 E2 E5 F2 21 Страница 97 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Сообщения 1С Сообщить Выводит сообщение пользователю, например: Сообщить("Привет, мир!"); В толстом клиенте сообщение выводится в специальном окне снизу, которое открывается/закрывается командой Окна/Служебные окна/Служебные сообщения. В тонком клиенте сообщение выводится в окне, в коде которого оно было вызвано, в панели справа. Функция работает также в коде, выполняемом на сервере. В этом случае, сообщение пользователь увидит как только выполнение перейдет на клиент. Чтобы показать статус сообщения, вторым параметром можно указать его тип: Сообщить("Ошибка: не получилось запросить данные", СтатусСообщения.Важное) Виды статусов: СтатусСообщения.БезСтатуса СтатусСообщения.Важное СтатусСообщения.Внимание СтатусСообщения.Информация СтатусСообщения.Обычное СтатусСообщения.ОченьВажное В типовых конфигурациях для толстого клиента, например «Управление производственным предприятием, редакция 1.3» в Страница 98 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] общем модуле ОбщегоНазначения имеется СообщитьОбОшибке(), которая «универсализирует» данный функцией. функция работу с 1С Предупреждение Выводит сообщение в диалоговом окне с кнопкой ОК, по нажатию на которую окно закрывается, например: Предупреждение("Привет, мир!"); То же, уточняем текст в заголовке окна: Предупреждение("Привет, мир!",,"Очень важное сообщение"); Доступно только на клиенте. Сильно не рекомендуется использовать в обработчиках, например обработке проведения, так как замедляет проведение (или останавливает его), что вызывает блокировки. Чтобы диалоговое окно самостоятельно закрылось самостоятельно, через несколько секунд, вторым параметром можно указать количество секунд: Предупреждение("Привет, мир!", 5); 1С СообщениеПользователю Выводит сообщение пользователю (после окончания обработки) или сохраняет его в очередь, если сообщение невозможно вывести «прямо сейчас», например: Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Привет, мир!"; Сообщение.Сообщить(); Во многих случаях сообщения генерируются массово во время определенной обработки. Например, при проверке большой таблицы, может появится множество сообщений об ошибках – в разных строчках таблицы. Или при обработке проведения. При этом обработка может вестись на сервере или в регламентном задании и вывести данные сообщения затруднительно. Страница 99 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] СообщениеПользователю записывает сообщения в некоторую очередь, и, после окончания обработки выводит их пользователю, если это возможно. Иначе – весь список сообщений возможно получить с помощью метода ПолучитьСообщенияПользователю(). Чтобы вывести сообщение пользователю в конкретной, уже открытой форме, дополнительно нужно установить идентификатор формы: Сообщение.ИдентификаторНазначения = Форма.УникальныйИдентификатор; Чтобы сообщение было выведено во всплывающем окне у конкретного поля формы, в модуле которой выполняется код, нужно указать «путь» к нему: Сообщение.Поле = "Наименование"; //где реквизит формы Сообщение.Поле = "Объект.Наименование"; реквизит объекта (т.е. справочника, чья Сообщение.Поле = "Товары[3].Цена"; //где форме, Цена – колонка этой таб.части Наименование – это //где Наименование – это форма редактируется) Товары – таб.часть на Чтобы сделать то же, но в модуле другого объекта (общем модуле), нужно дополнительно указать объект (СправочникОбъект, ДокументОбъект и т.п.): Сообщение.Поле = "Наименование"; //где Наименование – это реквизит СправочникОбъект Сообщение.УстановитьДанные(СправочникОбъект); //При двойном щелчке на сообщение будет открыта форма объекта со всплывающим сообщением у требуемого поля Другой способ связать сообщение с данными объекта: //для справочника, документа.. Сообщение.КлючДанных = СправочникСсылка; Сообщение.ПутьКДанным = "Объект"; //для записей регистра Сообщение.КлючДанных = РегистрМенеджерЗаписи.ИсходныйКлючЗаписи; //обычно основной реквизит формы, связанный с регистром Сообщение.ПутьКДанным = "Запись"; Страница 100 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] В типовых конфигурациях на управляемых формах для тонкого клиента, например «Управление торговлей, редакция 11» и «Бухгалтерия, редакция 3», в общем модуле ОбщегоНазначенияКлиентСервер имеется функция СообщитьПользователю(), которая «универсализирует» работу с данным объектом. Синтаксис функций в разных конфигурациях – разный. Так как СообщениеПользователю формирует список сообщений, чтобы его обнулить (например, перед выполнением сложной обработки), можно вызвать функцию: ПолучитьСообщенияПользователю(Истина); Обработать накопившийся список сообщений, после обработки, можно следующим образом: СообщенияПользователю = ""; //параметр Истина – очистить список после получения копии СписокСообщений = ПолучитьСообщенияПользователю(Истина); Для каждого Сообщение из СписокСообщений Цикл Если не ПустаяСтрока(СообщенияПользователю) Тогда СообщенияПользователю = СообщенияПользователю + Символы.ПС; КонецЕсли; СообщенияПользователю = СообщенияПользователю + Сообщение.Текст; КонецЦикла; Страница 101 из 102 Язык 1С. Быстрый старт. www.howknow1c.ru Шнурков Алексей [email protected] Итоги Итак, прочитав том 1, мы с Вами узнали основные сведения о языке 1С – основные конструкции, работа с типами, метаданными и файлами, обработка ошибок. Вам необходимо следовать плану обучения, который охватывает все области знаний, необходимые для того, чтобы стать экспертом 1С. Предлагаем Вам перейти к следующему тому серии «Быстрый старт 1С» - «Язык 1С. Том 2», который является справочником по языку 1С и расскажет Вам о работе с числами, датами, строками, массивами, списками значений. Книга «Быстрый старт 1С» - «10. Язык запросов 1С» расскажет Вам о самостоятельном написании запросов к базе данных 1С на языке запросов 1С, или конструировании текста запроса с помощью конструктора запросов. Не забывайте во время обучения получать практический опыт! Страница 102 из 102