doc-файл - Кафедра анализа данных и исследования операций

advertisement
КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
КАФЕДРА ЭКОНОМИЧЕСКОЙ КИБЕРНЕТИКИ
АНДРИАНОВА А.А.,
ПИНЯГИНА О.В.,
МУХТАРОВА Т.М.
Программирование
в среде
1С:Предприятие
Казань – 2006
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
УДК 004.9
ББК 32.973.26 – 018.2
Печатается по постановлению редакционно-издательского совета
факультета вычислительной математики и кибернетики
Казанского государственного университета
Рецензенты:
кандидат экономических наук, доцент кафедры экономики Казанского
государственного университета
Г.Р. Сингатуллина,
кандидат педагогических наук, доцент кафедры информационных
технологий Института экономики, управления и права
Л.Н. Тишкина.
Андрианова А.А., Пинягина О.В., Мухтарова Т.М.
Программирование в среде 1С:Предприятие.: Учебное пособие/
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова –
государственный университет, 2006. – 130 с.
Казань: Казанский
Цель данного учебного пособия заключается в ознакомлении читателя
с основными принципами программирования в среде 1С:Предприятие 7.7.
Рассматриваются принципы создания новых программных модулей по
работе со справочниками, документами, бухгалтерскими счетами,
операциями и проводками, генерации отчетов и формированию
бухгалтерских итогов, осуществлению экспорта и импорта данных. Пособие
разработано для поддержки компьютерных занятий по учебной дисциплине
«Автоматизация бухгалтерского учета» для студентов факультета
Вычислительной математики и кибернетики. Пособие ориентировано на
читателя, хорошо знакомого с принципами объектно-ориентированного
программирования, а также имеющего представление о правилах ведения
бухгалтерского учета на предприятии.
Электронная версия данного учебного пособия находится на сайте
кафедры
экономической
кибернетики
КГУ
по
адресу:
http://kek.ksu.ru/EOS/1C/index.html.
 Казанский государственный
университет, 2006
Андрианова А.А., Пинягина О.В.,
Мухтарова Т.М., 2006
2
Программирование в среде 1С:Предприятие
Содержание
СОДЕРЖАНИЕ ......................................................................................... 3
ПРЕДИСЛОВИЕ ....................................................................................... 5
СОЗДАНИЕ НОВОЙ КОНФИГУРАЦИИ .................................................. 8
ГЛАВА 1. ОСНОВЫ ВСТРОЕННОГО ЯЗЫКА СИСТЕМЫ
1С:ПРЕДПРИЯТИЕ................................................................................. 10
Программный модуль. Процедуры и функции............................................. 10
Типы данных. Объявление переменных ........................................................ 13
Операторы встроенного языка ........................................................................ 18
Системные процедуры и функции .................................................................. 19
Системные функции ввода-вывода................................................................. 22
ГЛАВА 2. РАБОТА СО СПРАВОЧНИКАМИ ......................................... 26
Основные понятия .............................................................................................. 26
Работа с элементами управления диалога ..................................................... 30
Создание диалога с закладками ....................................................................... 34
Работа со справочником в программном модуле ......................................... 37
ГЛАВА 3. РАБОТА С ПЛАНОМ СЧЕТОВ. ............................................ 42
ГЛАВА 4. РАБОТА С ДОКУМЕНТАМИ ................................................. 45
Пример – документ «Ввод начальных остатков» ......................................... 45
Пример – документ «Поступление материалов» .......................................... 53
Работа с документами в программном модуле ............................................. 58
Ввод документа на основании другого документа. ...................................... 59
Пример – документ «Проведение НДС» ......................................................... 61
Агрегатный тип данных «ТаблицаЗначений» .............................................. 64
Пример – документ «Платежное поручение» ................................................ 68
Пример – документ «Выписка банка» ............................................................ 74
Ведение оперативного учета ............................................................................. 78
ГЛАВА 5. РАЗРАБОТКА ПЕЧАТНЫХ ФОРМ И ОТЧЕТОВ................. 84
Основные понятия .............................................................................................. 84
3
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Пример – отчет «Журнал документов»........................................................... 88
Агрегатный тип данных «БухгалтерскиеИтоги» ......................................... 91
Создание диаграмм ............................................................................................. 94
Создание отчетов с помощью запросов .......................................................... 97
ГЛАВА 6. ЭКСПОРТ И ИМПОРТ ДАННЫХ В СИСТЕМЕ
1С:ПРЕДПРИЯТИЕ .............................................................................. 102
Работа с файловой системой ........................................................................... 102
Экспорт и импорт данных с помощью текстовых файлов ....................... 103
Экспорт и импорт данных с помощью файлов формата DBF ................. 107
Экспорт и импорт данных с помощью файлов формата XML ................ 112
ГЛАВА 7. РАБОТА С МЕТАДАННЫМИ ............................................. 121
ЛИТЕРАТУРА ....................................................................................... 130
4
Программирование в среде 1С:Предприятие
Предисловие
Работа бухгалтерии любой организации сводится не только к хранению
данных об имуществе и обязательствах предприятия, но и к формированию
на основании этих данных бухгалтерских отчетов различного уровня
сложности. Конечно, такую работу можно проделать, используя различные
программные продукты, предназначенные для удобного хранения данных –
базы данных или, в простом случае, электронные таблицы. Однако одним из
основных
требований
к
бухгалтерском
учете)
бухгалтерской
операции.
бухгалтерскому
является
учету
документальное
Поэтому
(согласно
закону
обоснование
актуальным
для
о
каждой
приложения,
реализующего автоматизацию работы бухгалтерии, является удобный
интерфейс, позволяющий создавать все основные типы документов,
применяемые на предприятии. Однако для того чтобы иметь такую
пользовательскую
оболочку,
требуется
огромный
объем
работы
программистов. Поэтому создание собственных бухгалтерских приложений
каждым предприятием в отдельности часто не является рентабельным. В
этой
связи
широкое
распространение
получили
специализированные
бухгалтерские программы, облегчающие работу программистов по настройке
и созданию бухгалтерских документов и отчетов.
Все современные бухгалтерские программы основаны на создании
документооборота
предприятия.
Процесс
работы
с
бухгалтерской
программой представляется так. Пользователь вводит первичные документы,
которые обрабатываются программой. Результатом этой обработки являются
сформированные хозяйственные операции. Каждая хозяйственная операция
представляет собой набор бухгалтерских проводок. Таким образом, главная
цель автоматизации бухгалтерских задач – обеспечение автоматического
формирования хозяйственных операций, а также обеспечение удобного
хранения и анализа бухгалтерской информации.
5
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Сегодня наиболее популярными программами являются "БЭСТ",
"Парус", "1С Предприятие" и "Компас". Все они являются системами
автоматизации, т. е. позволяют осуществлять работу предприятия в
согласованном режиме сразу на нескольких участках, либо последовательно
на разных этапах хозяйственного цикла.
Система
"1С.Предприятие"
компонентах,
которыми
базируется
являются
блоки
на
трех
основных
"Бухгалтерский
учет",
"Оперативный учет", "Расчет". В пакет, поступающий в продажу, всегда
входит
типовая
конфигурация.
Типовые
конфигурации
программы
"1С:Предприятие" представлены такими законченными решениями как
"Бухгалтерский
учет",
"Зарплата
и
Кадры",
"Торговля
и
Склад",
"Производство, услуги, бухгалтерия". Кроме того, существуют типовые
конфигурации для самых разных видов деятельности, в том числе
"Автосервис", "Строительство", "Бюджетное управление", "Финансовый
анализ",
"Производственный
учет",
"Бухгалтерия
для
бюджетных
организаций", "Гостиница" и другие. Количество предлагаемых типовых
решений на платформе "1С" значительно превышает возможное количество
типовых решений на базе любой другой системы.
Следует учитывать, что "Компас", "БЭСТ" являются закрытыми
системами
и
не
разработчики
могут
сами
быть
изменены
проводят
приспосабливая
их
к
дорогостоящий
процесс,
пользователем.
модификацию
специфике
который
базовых
конкретного
нередко
Компаниимодулей,
предприятия.
вызывает
Это
трудности
сопровождения и обновления версий.
В программе "1С:Предприятие" применяется другой подход. Хотя
базовые
компоненты
недоступны
пользователю,
функциональные
конфигурации, написанные на встроенном языке, полностью доступны для
модификации. Это предоставляет пользователю возможность быстро и
эффективно
модифицировать
конфигурацию,
с
которой
работает
предприятие, вводить в нее новые задачи, документы, системы учета,
6
Программирование в среде 1С:Предприятие
подстраиваться под изменение законодательства. Для этого требуется работа
программистов, знающих встроенный язык среды "1С:Предприятие" и ее
систему взаимосвязанных компонентов.
Первая глава учебного пособия рассматривает основные возможности
встроенного языка системы "1С:Предприятие". Последующие главы
посвящены
работе
с
конкретными
элементами
конфигурации
–
справочниками, планом счетов, документами, отчетами. Две последние главы
посвящены экспорту и импорту данных в системе "1С:Предприятие" и
работе с метаданными.
В качестве программного средства разработки использовалась версия
"1С:Предприятие 7.7". Заметим, однако, что основные принципы и
алгоритмы работы, представленные в этом пособии, можно перенести и на
версию "1С:Предприятие 8.0".
7
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Создание новой конфигурации
Опишем
последовательность
действий
при
создании
новой
конфигурации.
1.
Создадим каталог, в котором будут храниться все файлы
конфигурации и файлы данных.
2.
Выберем режим конфигуратора.
3.
В окне Запуск 1С:Предприятия (рис.1) щелкнем по кнопке
Добавить для создания новой базы данных для конфигурации.
Рис. 1. Окно запуска системы «1С:Предприятие»
4.
В окне регистрации укажем название и путь к базе данных для
нашей конфигурации. После регистрации название нашей конфигурации
появится в списке информационных баз в окне Запуск 1С:Предприятия.
5.
Выбираем свою базу, запускаем для нее конфигуратор. Заметим,
что таким же образом можно запустить режим работы с данными
1С:Предприятие.
6.
Проводим начальную инициализацию конфигурации. Для этого
выбираем пункт меню Конфигурация - Открыть конфигурацию. В
результате появится окно с объектами конфигурации (рис. 2).
7.
Сохраняем конфигурацию.
8
Программирование в среде 1С:Предприятие
8.
Для быстрого запуска режима 1С:Предприятие, можно нажать
кнопку
на панели инструментов. Основные функциональные пункты
меню здесь – Операции и Сервис.
Рис. 2. Окно конфигурации системы «1С:Предприятие»
9
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Глава 1. Основы встроенного языка системы
1С:Предприятие
Программный модуль. Процедуры и функции
1C:Предприятие
–
универсальная
программа.
Отличительная
особенность ее заключается в разделении процесса настройки и процесса
работы с данными. Настройка производится в части системы, называемой
Конфигуратором, а непосредственная работа с данными осуществляется в
режиме 1С:Предприятие. Конфигурирование, т.е. настройка системы,
осуществляется на встроенном языке системы 1С:Предприятие.
На встроенном языке системы 1C:Предприятие нельзя написать
программу, выполняемую самостоятельно. Любой программный модуль
здесь
есть
часть
конфигурации
всей
системы.
Место
размещения
программных модулей определяется элементом конфигурации, являющимся
собственником данного модуля. Существует только один программный
модуль, который принадлежит всей конфигурации в целом. Это глобальный
программный модуль.
Среди
основных
элементов
конфигурации
можно
выделить
следующие:

Константы – элементы данных, часто используемые, но редко
меняющиеся.

Перечисления – фактически списки констант, сгруппированные
по смыслу (например, список валют).

Справочники – хранилища данных об объектах бухгалтерского
учета (например, об основных средствах, материалах, сотрудниках, статьях
затрат на производство и пр.).

Документы – основное средство проведения и регистрации
хозяйственных операций.
10
Программирование в среде 1С:Предприятие

Отчеты – средство наглядного представления и анализа
имеющихся данных в различных целях (например, баланс, оборотносальдовая ведомость, анализ счета, анализ субконто).

Обработки
–
процедуры
обработки
данных,
не
всегда
требующие наглядного сопровождения (например, экспорт данных в файл
DBF).

Виды Субконто - типы данных аналитического учета. Связаны
со справочниками, которые хранят собственно объекты аналитического
учета.
Структуру программного модуля можно разбить на следующие
разделы:
 раздел определения переменных;
 раздел процедур и функций;
 раздел основной программы.
Для определения процедуры модуля используется оператор:
Процедура ИмяПроц([Знач] Пар1[=ДефЗнач], ...,
[Знач] ПapN[=ДeфЗнaч]) [Экспорт]
//Объявления локальных переменных;
//Операторы;
[Возврат;]
КонецПроцедуры
Ключевое слово Экспорт может указываться только в глобальном
программном модуле для того, чтобы данная процедура была доступной из
других программных модулей.
Процедура может иметь произвольное число параметров, для каждого
параметра можно задать значение по умолчанию. Тип данных у параметров
не указывается. По умолчанию все параметры передаются в процедуру по
ссылке, т.е. они могут менять свои значения внутри процедуры. Если нет
11
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
необходимости менять значения параметра, то следует перед ним указать
ключевое слово Знач. В списке передаваемых фактических параметров при
вызове процедуры можно опустить любой параметр, однако в этом случае
придется ставить разделительную запятую. Если значение параметра при
вызове процедуры не указано, то параметр принимает значение по
умолчанию,
если
таковое
есть,
либо
"пустое"
значение
(значение
неопределенного типа). Процедура заканчивает свою работу при выполнении
оператора Возврат, либо после выполнения всех операторов процедуры.
Аналогичным
правилам
подчиняется
и
определение
функций
программного модуля.
Функция ИмяФунк([Знач] Пар1[=<ДефЗнач>],...,
[Знач] <ПарN>[=<ДефЗнач>])[Экспорт]
//Объявления локальных переменных;
// Операторы;
Возврат ВозвращаемоеЗначение;
КонецФункции
В тексте программного модуля допускается предварительное описание
процедур и функций без их определения. На то, что это предварительное
описание, должно указывать наличие ключевого слова Далее, которое
замещает тело процедуры или функции.
Процедура А(A1, A2) Далее
Процедура Б()
Перем АА, ББ;
А(АА, ББ);
КонецПроцедуры
Процедура А(A1,A2)
A1=1;
A2=2;
КонецПроцедуры
12
Программирование в среде 1С:Предприятие
Типы данных. Объявление переменных
Встроенный язык системы 1С:Предприятие не является жестко
типизированным. Тип переменной определяется ее значением. В языке
поддерживаются следующие базовые (стандартные) типы данных:

Число;

Строка;

Дата.
Значения типа Дата представляются в формате "ДД.ММ.ГГ".
Особое место в языке занимают агрегатные типы данных.
Переменные этих типов данных – это объекты, имеющие свои свойства и
методы. Типичная последовательность работы с объектом агрегатного типа
данных выглядит следующим образом:

с
помощью
функции
СоздатьОбъект()
создается
объект
агрегатного типа данных, и какой-либо переменной присваивается ссылка на
него;

объект позиционируется на нужном элементе данных;

производятся различные манипуляции с объектом агрегатного
типа данных;

в случае, когда объект больше не нужен, он может быть
отсоединен от переменной посредством переприсваивания переменной
какого-либо значения базового типа, обычно числа 0. Отсоединение объекта
выполнять не обязательно.
Разберем
эту
последовательность
на
конкретном
примере.
Предположим, что нам нужно найти информацию о конкретном сотруднике
нашего
предприятия.
Для
решения
задачи
создадим
объект
Справочник.Сотрудники с помощью функции СоздатьОбъект().
13
типа
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
НашСотрудник = СоздатьОбъект("Справочник.Сотрудники");
Далее требуется позиционировать созданный объект на конкретном
элементе данных.
НашСотрудник.НайтиПоНаименованию("Иванов");
После этого можно выполнять любые действия с созданным объектом,
содержащим уже информацию о сотруднике по фамилии Иванов. После
выполнения требуемой обработки нужно отсоединить объект. Для этого
достаточно присвоить объекту значение 0.
НашСотрудник=0;
Удаление созданных объектов производится системой в момент, когда
не остается ни одной переменной, содержащей ссылку на этот объект.
Перечислим агрегатные типы данных, существующие во встроенном
языке 1C:Предприятие.

Константа – средство работы с постоянными значениями
(название организации, почтовый адрес).

Справочник – средство для ведения списков однородных
элементов данных, содержащих наименования элементов и различную
дополнительную информацию, называемую реквизитами (или атрибутами)
справочника.

Перечисление – средство работы с элементами данных, список
возможных значений которых жестко задан (например, для перечисления
ФормаОплаты можно задать возможные значения: Нал, Безнал). В отличие
14
Программирование в среде 1С:Предприятие
от справочников, списки значений в перечислении задаются в процессе их
создания и далее не могут быть изменены.

Документ – средство для ввода первичной информации о
совершаемых
хозяйственных
операциях.
Все
реквизиты
документов
подразделяются на реквизиты шапки (общие для всего документа реквизиты
– дата документа, номер документа) и реквизиты табличной части
(повторяющиеся реквизиты, например, наименование покупаемого товара и
его стоимость – документ о покупке может включать список товаров).

Регистр
–
средство
обработки
и
накопления
сводной
информации оперативного учета.

ПланСчетов – это служебный тип данных, хранящий список
объектов типа Счет.

Счет – это агрегатный тип данных, предназначенный для
обособления информации о бухгалтерских счетах в разрезе синтетического
учета наличия и движения средств.

ВидСубконто – служебный тип данных, предназначенный для
определения видов объектов аналитического учета.

Операция
–
средство
для
манипулирования
данными
бухгалтерских операций и проводок, формируемых документами. Все
проводки в системе 1С:Предприятие принадлежат операциям, поэтому
управление проводками также производится объектом Операция.

БухгалтерскиеИтоги – средство, позволяющее организовать
хранение, динамический пересчет бухгалтерских итогов, их извлечение за
различные периоды, с различной степенью детализации, в разрезе
синтетического и аналитического учета. Можно задавать свойства хранения
итогов: количественный и валютный учет, виды субконто в аналитическом
учете. Хранение бухгалтерских итогов автоматически поддерживается на
основе существующих в системе планов счетов.

Календарь – средство учета времени по календарным дням.
15
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова

Запрос – средство для обращения к документам, регистрам,
справочникам для получения некоторой сводной информации.

Текст – средство работы с текстовыми файлами.

Таблица – средство для работы с печатными формами
документов, отчетов.

СписокЗначений – средство для создания списка значений
каких-либо данных и возможности выбирать нужные значения из списка.
Объекты этого типа обычно создаются при добавлении в диалогах
комбинированных или обычных списков выбора, а также для организации в
программном модуле аналогов динамических массивов.

ТаблицаЗначений – тип данных, аналогичный типу данных
СписокЗначений, но содержащий несколько столбцов.

Картинка – средство для работы с графическими файлами.

Периодический – средство для работы с периодическими
реквизитами справочников и периодическими константами.

ФС – средство для работы с дисковыми файлами. В глобальном
контексте существует объект этого типа с именем ФС.

XBase – средство для работы с файлами баз данных DBF
формата.
Агрегатные типы данных – это объекты, имеющие свои свойства
(атрибуты) и методы. Некоторые свойства объектов доступны только для
чтения. Обращение к свойствам и методам происходит согласно правилам:
ИмяОбъекта.Свойство
ИмяОбъекта.Метод()
Возможно также обращение к свойствам и методам без указания имени
объекта в том случае, если объект агрегатного типа входит в набор
непосредственно доступных программному модулю.
16
Программирование в среде 1С:Предприятие
В языке переменные не обязательно объявлять в явном виде. Неявным
определением переменной является первое ее появление в левой части
оператора присваивания. Явное объявление переменной производится при
помощи
оператора
Перем.
Тип
переменной
определяется
типом
присвоенного ей значения. Переменные могут объединяться в массивы. В
данной
реализации
программы
(версия
7.7)
предусмотрены
только
одномерные массивы.
Для
явного
объявления
переменных
используется
следующий
оператор:
Перем ИмяПерем [[РазмерМассива]] [Экспорт];
Ключевое слово Экспорт используется только в глобальном модуле
для указания, что объявляется переменная, которая должна быть доступна
для других модулей. В случае объявления массива требуется в квадратных
скобках
указать
размер
массива,
который
должен
быть
целым
положительным числом. Не допускается использование переменной в
качестве размера массива. Например,
Перем МояПеременная;
Перем МойМассив[10];
Область видимости переменных, как и в других языках, определяется
местом объявления переменной. Возможны три случая:

В разделе определения переменных глобального программного
модуля. Если переменная определена с ключевым словом Экспорт, она
является глобальной переменной и видна в любой процедуре или функции
любого программного модуля конфигурации.
17
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова

В разделе определения переменных программного модуля. Такие
переменные доступны только в пределах того программного модуля, в
котором объявлены.

В разделе определения переменных процедуры или функции. Это
локальные переменные.
Операторы встроенного языка
Перечислим основные операторы встроенного языка 1C:Предприятие.
1.
Условный оператор.
Если ЛогВыражение Тогда
//операторы;
[ИначеЕсли ЛогВыражение Тогда]
//операторы;
[Иначе]
//операторы;
КонецЕсли;
2.
Циклы.
a) цикл с условием
Пока ЛогВыражение Цикл
//операторы;
КонецЦикла;
б) цикл со счетчиком
Для ПерСчетчик = Выражение1 По Выражение2 Цикл
//операторы;
КонецЦикла;
3.
Безусловная передача управления другому оператору программы.
18
Программирование в среде 1С:Предприятие
Перейти ИмяМетки;
Для того чтобы поставить метку на какой-либо оператор, необходимо
указать:
ИмяМетки: оператор
Запрещается переход на операторы Процедура и Функция, а также на
операторы, находящиеся внутри конструкций циклов или условий. Область
действия оператора Перейти ограничена программным модулем, процедурой
или функцией, в которой оператор применен.
4.
Передача управления в начало цикла (аналог оператора С++ continue).
Продолжить;
5.
Прерывание выполнения цикла (аналог оператора С++ break).
Прервать;
Системные процедуры и функции
Системные процедуры и функции доступны в любом программном
модуле конфигурации. Перечислим некоторые из них, сгруппировав их по их
назначению.
19
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Математические функции
Окр(Число1,
[Число2],
[Способ])
Цел(Число)
Мин(Элемент1,
...,ЭлементN)
Макс(Элемент1,
...,ЭлементN)
Лог10(Число)
Лог(Число)
Округлить Число1 до Числа2 знаков после запятой (по
умолчанию 0) одним из двух способов: Способ=0 –
1.5=1; Способ=1 – 1.5=2. Возвращаемое значение –
результат округления.
Получение целой части Числа
Возвращает значение минимального (максимального)
элемента из списка. По типу Элемента1 осуществляет
преобразование типов остальных элементов в случае
несовпадения. Тип Элемента1 обязательно должен
быть базовым типом.
Возвращает десятичный и натуральный логарифмы
Числа соответственно. При отрицательном и нулевом
значении параметра возвращает 0.
Строковые функции
СтрДлина(Строка)
ПустаяСтрока(Строка)
СокрЛ(Строка)
СокрП(Строка)
СокрЛП(Строка)
Лев(Строка,Число)
Прав(Строка,Число)
Сред(Строка,
Число1,Число2)
Найти(Строка1,Строка2)
Возвращает длину Строки
Возвращает 1, если Строка пустая или
состоит только их пробелов, и 0 – в
противном случае.
Возвращает
строку,
в
которой
отсечены все стоящие слева (справа
или с обеих сторон) пробелы Строки.
Возвращает первые слева (справа)
символы Строки в количестве,
задаваемом параметром Число.
Возвращает подстроку параметра
Строка, начиная с символа с номером
Число1 общим количеством Число2.
Позиции в строке считаются, начиная
с 1. Параметр Число2 может быть
опущен, тогда конечным символом
подстроки
считается
последний
символ Строки.
Возвращает позицию первого знака
подстроки Строка2 в Строке1. Если
такой
подстроки
не
найдено,
возвращает 0.
20
Программирование в среде 1С:Предприятие
СтрЗаменить(СтрИсточник,
СтрПодстрока,СтрЗамена)
СтрКоличествоСтрок(Строка)
СтрПолучитьСтроку(Текст,
НомерСтроки)
ВРег(Строка)
НРег(Строка)
Возвращает строку СтрИсточник, в
которой подстрока СтрПодстрока
заменена подстрокой СтрЗамена.
Исходная строка СтрИсточник при
этом не меняется.
Возвращает
число
строк
в
многострочном
тексте,
заданном
параметром Строка, в котором строки
разделены символами перевода строк.
Возвращает
строку
с
номером
НомерСтроки из многострочного
текста, заданного параметром Текст.
Переводит Строку в верхний (нижний
регистр).
Функции работы с датой
РабочаяДата(Дата,
РежимСменыРабДаты)
Позволяет получить/установить рабочую дату.
Возвращает рабочую дату на момент до
выполнения функции. Второй параметр
РежимСменыРабДаты обозначает режим
смены даты в полночь: 0 – не менять; 1 –
менять с предупреждением; 2 – менять без
предупреждения.
ТекущаяДата()
Возвращает текущую (системную) дату.
ДобавитьМесяц(Дата,
ЧислоМесяцев)
Добавляет
к
дате,
заданной
первым
параметром, число месяцев, заданное вторым
параметром.
НачМесяца(Дата)
НачКвартала(Дата)
НачГода(Дата)
НачНедели(Дата)
Возвращает дату, которая является началом
соответствующего периода.
КонМесяца(Дата)
КонКвартала(Дата)
КонГода(Дата)
КонНедели(Дата)
Возвращает дату, которая является концом
соответствующего периода.
ДатаГод(Дата)
Возвращает
21
запрашиваемую
составляющую
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
ДатаМесяц(Дата)
ДатаЧисло(Дата)
НомерНеделиГода
(Дата)
НомерДняГода(Дата)
НомерДняНедели(Дата)
ПериодСтр(
ДатаНачалаПериода,
ДатаКонцаПериода)
Даты.
Возвращает
номер
составляющей Даты.
соответствующей
Возвращает строковое представление периода,
начало и конец которого указаны в качестве
параметров. Наиболее часто такие строки
используются при формировании отчетов.
Если рассматриваемый период будет являться
кварталом, годом или месяцем, то строковое
выражение отобразит это соответствующим
образом, например, "2 квартал 2002 г."
Функции преобразования типов
Дата(Год,Месяц,Число)
Строка(Парам)
Число(Парам)
Формирует из значений параметров значение
типа Дата.
Преобразует значение, переданное в качестве
параметра, в символьную строку.
Преобразует параметр в число.
Системные функции ввода-вывода
В данном разделе представлены группы процедур и функций, цель
которых – обеспечение взаимодействия с пользователем.
Для вызова диалога для ввода значений определенных типов
используется следующая функция.
ВвестиЗначение(3нач, Подсказка, Тип, Длина, Точность)
22
Программирование в среде 1С:Предприятие
Данная функция выводит на экран окно диалога, заголовком которого
является значение параметра Подсказка. В результате работы диалога в
переменную, задаваемую параметром Знач (переменная должна быть
объявлена
заранее),
вводится
значение,
тип
которого
определяется
параметром Тип (строковое выражение, например, "Строка", "Число").
Последние два параметра определяют возможную длину значения и
количество знаков после запятой для вещественных чисел. Функция
возвращает значение 1, если окончание работы диалога было инициировано
нажатием кнопки OK, и 0 – в противном случае.
Для ввода числа можно использовать следующую функцию.
ВвестиЧисло(Число, Подсказка, Длина, Точность, Таймаут)
Здесь параметр Таймаут представляет собой числовое выражение
интервала времени (в секундах), в течение которого система будет ожидать
ответа пользователя. Если данный параметр опущен или равен 0, то время
ожидания бесконечно. Значение по умолчанию – 0. В отличие от
предыдущей функции, работа данной функции может завершиться, когда
закончено время ожидания. В этом случае функция ВвестиЧисло вернет
значение -1.
Аналогичным образом с помощью следующей функции можно вводить
символьные строки.
ВвестиСтроку(Стр, Подсказка, ДлинаСтр, Признак, Таймаут)
Здесь параметр Признак, равный 0 или 1, означает соответственно
ввод обычной строки или многострочного текста с разделителями строк.
Задачи бухгалтерского учета отводят много внимания работе с датами.
Поэтому реализована функция, осуществляющая ввод дат.
23
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
ВвестиДату(Дата, Подсказка, Таймаут)
Можно
ввести
период
посредством
диалогового
окна.
Это
осуществляет функция
ВвестиПериод (НачПериода, КонПериода, Подсказка)
Для вывода пользователю окна сообщений используется следующая
функция.
Вопрос(ТекстВопроса, Режим, Таймаут)
Параметр Режим можно задавать в числовом или строковом виде.
Возможны
следующие
Стоп+Повтор+Пропустить
варианты:
(2),
ОК
Да+Нет+Отмена
(0),
(3),
ОК+Отмена(1),
Да+Нет
(4),
Повтор+Отмена (5). Соответственно выбранному режиму вывода диалога
функция может возвращать следующие строковые или числовые константы:
Таймаут (-1), ОК (1), Отмена (2), Стоп (3), Повтор (4), Пропустить (5), Да (6),
Нет (7).
Для вывода упрощенного сообщения-предупреждения, не требующего
ответа, можно использовать два эквивалентных способа. Во-первых, можно
использовать функцию Вопрос следующим образом:
Вопрос("Сообщение",0);
Второй способ заключается в использовании следующей процедуры:
Предупреждение(ТекстСообщения, Таймаут)
24
Программирование в среде 1С:Предприятие
Оболочка
1С:Преприятие
содержит
окно
сообщений
для
пользователя, в которое системой выводятся сообщения о состоянии
выполнения процесса и отдельных операциях. Сообщения можно предварять
пиктограммой. Для вывода нового сообщения в окно сообщений можно
использовать процедуру
Сообщить(ТекстСообщения, ИмиджМаркера)
Здесь ИмиджМаркера – строковое выражение, определяющее тип
пиктограммы, оно может принимать следующие значения: "I", "!", "!!", "!!!",
"." – обычное сообщение, " " – сообщение без маркера.
Можно очистить окно сообщений, используя процедуру
ОчиститьОкноСообщений()
Еще одним средством вывода информации может служить вывод в
строку состояния, осуществляемый посредством процедуры
Состояние(ТекстСообщения)
25
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Глава 2. Работа со справочниками
Основные понятия
Для хранения данных об объектах бухгалтерского учета в системе
1С:Предприятие
Справочник.
существует
Чтобы
агрегатный
хранить
тип
информацию
данных,
о
называемый
специфических,
пользовательских типах данных, мы можем создавать свои собственные
справочники, которые становятся новыми типами данных.
Рассмотрим основные понятия и этапы создания справочника на
примере справочника Материалы.
При создании справочника в окне конфигурации нужно выбрать пункт
Справочники, вызвать контекстное меню, выбрать в нем пункт Новый
Справочник. В качестве идентификатора указывается имя справочника как
типа данных (его используют в программных модулях). Синоним – это
наименование этого справочника для пользователя (используется для
представления этого справочника в режиме 1С:Предприятие). Синоним, в
отличие от идентификатора, может быть представлен несколькими словами.
Обычно при создании справочника запрашивается, нужно ли создавать
связанный с ним ВидСубконто (т.е. тип объектов аналитического учета).
Впоследствии при создании плана счетов ВидСубконто будет прикрепляться
к различным счетам, обозначая тем самым, в разрезе какого типа объектов
аналитики трактуются суммы, попадающие на соответствующие счета.
Например, к счету 10 "Материалы" может быть прикреплен ВидСубконто
Материалы, связанный со справочником Материалы. Это означает, что при
записи суммы на счет 10 должен быть указан конкретный материал из
справочника
материалов,
поступление
которого
оформляется
этой
операцией.
Объект типа создаваемого справочника может иметь произвольное
количество Реквизитов. Если применить аналогию с терминологией баз
26
Программирование в среде 1С:Предприятие
данных, то справочник образует сущность, а его реквизиты – атрибуты
сущности. По умолчанию в любом справочнике существует два реквизита –
Код и Наименование, причем один из них является главным, т.е. именно
этот реквизит будет отображаться при выборе элемента справочника в
различных формах документов, отчетов и пр. Другие реквизиты программист
может создать в списке Реквизиты, указав для каждого Идентификатор
(Цена), Тип значения (<<Число>>), Длину значения (10) и Точность (число
знаков после запятой, например, 2) (рис.2.1).
В качестве типа значения может использоваться и другой справочник,
созданный в системе. Например, пусть для материала требуется хранить
ссылку на его производителя. Тогда, если существует справочник
Производители, то в качестве типа значения реквизита Производитель
справочника
Материалы
будет
использоваться
тип
Справочник.Производители.
Рис.2.1. Диалог свойств реквизита справочника
Программисту дается возможность создавать группировку внутри
справочника. Например, основные средства можно разделить по следующему
признаку – здания, сооружения, транспорт, оборудование, инструмент и т.д.
Группа в справочнике представляет собой аналог папки, в которую
помещаются все объекты, принадлежащие этой группе. Для того чтобы было
возможно создавать группы, в диалоге конфигурации справочника требуется
указать Количество уровней.
27
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Создаваемый справочник можно подчинить другому справочнику. Для
этого в диалоге конфигурации создаваемого справочника выбирается из
списка Подчинен тот справочник, которому будет подчинен первый
справочник. Отношение подчинения справочников может рассматриваться
как аналог связи "один-ко-многим" при работе с реляционными базами
данных. Например, пусть создан справочник Марки, элементами которого
являются марки сотовых телефонов. Ему можно подчинить справочник
Модели. В результате создается впечатление, что элементы справочника
Модели принадлежат одному элементу справочника Марки.
Элементы справочника могут создаваться и редактироваться в списке
(рис.2.2) или в форме (в диалоге) (рис.2.3). Как должно происходить
редактирование,
нужно
указать
в
списке
Редактировать
в
окне
конфигурации справочника. Кнопки в этом окне позволяют настроить вид
списка справочника и вид формы. Заметим, что в случае, если справочник
использует группировку своих элементов, можно создать дерево просмотра
групп на форме списка.
Рис.2.2. Пример формы списка справочника «Контрагенты»
При создании формы списка или формы элемента используются три
вкладки: Диалог – настройка внешнего вида, Модуль – программные
28
Программирование в среде 1С:Предприятие
средства для обработки диалога, Таблица – настройка сопровождающего
вывода (если он необходим). Эти вкладки существуют не только для
справочников,
но
и
для
других
элементов
конфигурации
системы
1С:Предприятие, использующих диалоговые окна.
Рис.2.3. Пример формы элемента справочника «Материалы»
В нижней части окна при работе с диалогом присутствует панель
инструментов для элементов диалога (рис.2.4).
Рис.2.4. Панель инструментов «Элементы управления»
Особое внимание здесь стоит уделить последней кнопке. С помощью
нее можно добавить элементы управления для введения значений реквизитов
справочника. По умолчанию для каждого из реквизитов справочника
формируется
текстовое
поле.
Однако
существует
возможность
использования других элементов управления для обозначения в диалоге того
или иного реквизита. Это указывается в диалоговом окне, которое
29
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
вызывается при нажатии кнопки Реквизиты панели инструментов и выборе
на нем конкретного поля.
Работа с элементами управления диалога
При добавлении на форму элемента реквизита справочника создается
элемент управления с тем же идентификатором, что и имя выбранного
реквизита. Поэтому дополнительной обработки такие элементы управления
не требуют. Значение реквизита можно получить или обновить, например,
при обращении в программном модуле к идентификатору реквизита.
На
форму
элемента
справочника
можно
помещать
элементы
управления, не связанные с его реквизитами. Тогда в программном модуле
будет доступна переменная с именем, совпадающем с идентификатором
этого элемента управления. Эта переменная хранит текущее состояние
элемента. Путем присвоения переменной каких-либо значений можно
изменять это состояние.
Текстовое поле. Состоянием текстового поля является символьная
строка, отображаемая в нем.
Переключатели. Переключатели имеют только два состояния –
включен и выключен. Соответственно, значение, которое может принимать
переменная переключателя, может быть 1 (включен) или 0 (выключен).
Надпись, располагающаяся рядом с переключателем, задается с помощью
метода Заголовок (НовыйЗаголовок), возвращающего значение старого
заголовка. Этот метод имеют также такие элементы управления как
радиокнопка и надпись (метка). Управление последней осуществляется
только с помощью метода Заголовок(). Пусть, к примеру, существует
переключатель, идентификатор которого Проба. Тогда изменить заголовок
этого переключателя на строку "Пробный переключатель" можно с помощью
такого кода:
30
Программирование в среде 1С:Предприятие
Форма.Проба.Заголовок("Пробный переключатель");
Форма.Обновить();
Обрабатывая какой-либо диалог, система создает объект Форма. Этот
объект
содержит
идентификаторы
всех
элементов
управления,
расположенных в диалоге, как атрибуты объекта. Поэтому вызов метода
Заголовок() должен предваряться указанием идентификатора элемента
управления, для которого этот метод вызывается. Чтобы сделанные
изменения стали видимыми, требуется обновить диалог с помощью метода
Обновить() объекта Форма.
Группа радиокнопок. При создании группы радиокнопок требуется
называть все радиокнопки одинаковым идентификатором с номером, начиная
со второй кнопки (например, Кнопка, Кнопка1, Кнопка2). На факт выбора
первой кнопки (желательно, чтобы эта кнопка была отмечена как первая в
группе) нужно назначить вызов пользовательской процедуры. Внутри этой
процедуры происходит анализ значения первого идентификатора (Кнопка=1
при выборе первой кнопки, Кнопка=2 при выборе второй кнопки и т.д.) и
принятие
соответствующего
решения.
Присвоение
в
программе
идентификатору первой кнопки некоторого номера инициирует выбор
соответствующей кнопки. Установка идентификатора в -1 означает, что ни
одна из радиокнопок группы не должна быть выбрана.
Список выбора. Этому элементу соответствует агрегатный тип
данных СписокЗначений. Работа программиста с элементом управления
Список выбора осуществляется через методы именно этого агрегатного
типа данных.
Список выбора – это один из тех элементов управления, которые
требуют обязательной начальной инициализации, т.е. заполнения. Любой
диалог имеет предопределенную процедуру (процедура, которую вызывает
сама система, а не программист) ПриОткрытии(). В случае, когда требуется
31
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
начальная инициализация содержимого формы, эту процедуру следует
переопределить.
Процедура ПриОткрытии()
// инициализация элементов управления формы
КонецПроцедуры
Например, добавить строку в список выбора с идентификатором
МойСписок можно с помощью следующей процедуры агрегатного типа
данных СписокЗначений.
МойСписок.ДобавитьЗначение("Мое значение");
Программист может назначить последовательность команд (например,
вызов процедуры), которая является реакцией на работу с элементом
управления (меню Свойства элемента управления, вкладка Дополнительно,
поле Формула).
В частности, на действие выбора из списка можно назначить вызов
пользовательской процедуры, осуществляющей чтение выбранной строки
списка. Для этого можно вызвать метод ПолучитьЗначение() агрегатного
типа данных СписокЗначений. Параметр этого метода – номер строки
списка, которую нужно получить. Номер выбранной строки возвращает, в
свою очередь, метод ТекущаяСтрока(). Например,
МояПерем=МойСписок.ПолучитьЗначение
(МойСписок.ТекущаяСтрока());
Следует заметить, что функция ТекущаяСтрока() может также
устанавливать выбор строки списка. Для этого в качестве параметра следует
указать номер строки, которую следует выбрать.
32
Программирование в среде 1С:Предприятие
Отметим
также
процедуру
УстановитьЗначение(НомерСтроки,
Значение) агрегатного типа данных СписокЗначений, позволяющую
изменить значение в списке, которое имеет порядковый номер, задаваемый
параметром НомерСтроки.
Наконец, можно по заданному значению найти номер строки списка с
помощью метода НайтиЗначение(Значение). Если строка с искомым
значением будет найдена, то функция вернет номер этой строки. В
противном случае будет возвращен 0.
Значение некоторых реквизитов может принадлежать конечному
множеству значений. Такие реквизиты удобно создавать с помощью типа
данных Перечисление, т.е. указывать этот тип данных при создании
реквизита. При создании элемента конфигурации Перечисление требуется
указать его идентификатор (например, ЕдИзмерения) (после создания
появится новый агрегатный тип данных Перечисление.ЕдИзмерения) и все
его возможные значения. При создании новых значений (кнопка Новый)
требуется указать идентификатор значения (через него происходит
обращение
в
программных
модулях,
например,
Перечисление.ЕдИзмерения.Метр) и его представление (то, что увидит
пользователь при выборе из списка значений).
Управлять
редактирования
видимостью,
элементов
Видимость(ФлагВидимости),
доступностью
управления
можно
и
с
возможностью
помощью
методов
Доступность(ФлагДоступности)
и
Редактирование(ФлагРедактирования) элементов управления объекта
Форма. Эти методы получают в качестве параметра 1, если требуется, чтобы
элемент
управления
был
видимым,
доступным
и
редактируемым,
соответственно, 0 – в противном случае.
Как уже было сказано, если тот или иной элемент управления требует
программной реакции на его выбор (в случае списка выбора), нажатие (в
случае кнопок) и пр., то для этого создают пользовательские процедуры в
33
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
соответствующем программном модуле. Вызов этих процедур должен быть
прикреплен к элементу управления.
Например, на форме уже существует кнопка Выполнить, которая
вызывает процедуру Выполнить(), определенная в программном модуле
(вкладка Модуль). Вызов процедуры осуществляется через контекстное
меню кнопки (пункт Свойства, вкладка Дополнительно, поле Формула)
(рис.2.5). Следует заметить, что в поле Формула может быть записана любая
последовательность команд, разделенная символами ";", которая и будет
реакцией на активизацию элемента управления. Эта последовательность
ограничивается только длиной поля Формула.
Рис.2.5. Назначение вызова пользовательской процедуры
на нажатие кнопки «Выполнить»
Создание диалога с закладками
Часто
справочник
имеет
большое
количество
реквизитов,
расположение которых на диалоге справочника может оказаться неудобным.
В этом случае удобно применить для формы элемента справочника и других
34
Программирование в среде 1С:Предприятие
форм диалоги с закладками, когда можно сгруппировать реквизиты
справочника по нескольким страницам.
Диалог с закладками в системе 1С:Предприятие зачастую называют
формой со слоями (хотя формы со слоями могут применяться и без
использования закладок). Для использования на форме справочника слоев
требуется создать их с помощью кнопки
, расположенной на панели
инструментов. После создания слоев каждый элемент управления можно
поместить на конкретный слой. Это делается с помощью контекстного меню
элемента управления (пункт Поместить, посредством которого можно
выбрать из списка существующих слоев нужный слой).
Если теперь запустить режим 1С:Предприятие и проверить действие
диалога, то можно увидеть, что содержимое слоев накладывается друг на
друга, а закладок при этом нет. Таким образом, следующим шагом
программиста является создание закладок и установка взаимнооднозначного
соответствия между слоями и закладками. Обычно это делается при загрузке
формы, т.е. в предопределенной процедуре формы ПриОткрытии().
В этой процедуре сначала требуется установить режим использования
закладок на форме. Это делается с помощью метода объекта Форма
Форма.ИспользоватьЗакладки(Флаг);
Параметр метода Флаг должен быть равен 1, если требуется включить
закладки, 0 – в противном случае. Метод возвращает текущий режим
использования закладок.
Теперь объект Форма будет иметь атрибут Закладки – это объект типа
СписокЗначений, содержащий описание всех закладок текущей формы. Для
добавления закладок на форму используется следующий метод:
35
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Форма.Закладки.ДобавитьЗначение(НомерЗакладки,
НаименованиеЗакладки);
Однако даже после создания закладок все элементы управления всех
слоев будут еще видны. Требуется указать, какой из созданных слоев должен
быть использован на данный момент, т.е. связать конкретную закладку с
конкретным слоем. Это делается с помощью метода:
Форма.ИспользоватьСлой(ИмяСлоя);
Следующий вопрос, который необходимо решить – как осуществить
переключение между закладками. При щелчке мыши по конкретной закладке
система
вызывает
предопределенную
процедуру,
которую
требуется
переопределить:
ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
При переопределении нельзя изменять прототип процедуры. Одним из
вариантов переопределения процедуры может быть следующий код:
Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
Если НомерЗакладки=1 Тогда
Форма.ИспользоватьСлой("Основной");
Иначе
Форма.ИспользоватьСлой("Слой1");
КонецЕсли;
КонецПроцедуры
После выполнения этих действий закладки на диалоге будут
функционировать корректно.
36
Программирование в среде 1С:Предприятие
Работа со справочником в программном модуле
Созданный справочник является, с одной стороны, новым типом
данных, с другой стороны, некоторым хранилищем объектов этого типа
данных. Объекты типа данных, соответствующего некоторому справочнику,
называют элементами справочника.
Допустим, что в конфигурации определен справочник Материалы.
Этот справочник будет содержать конкретные виды материалов (доски,
нитки, шерсть и пр.) и их характеристики. Тип данных, соответствующий
этому справочнику, имеет идентификатор Справочник.Материалы. Чтобы
работать с элементами справочника, требуется переменная этого типа
данных. Как и любая другая переменная агрегатного типа данных,
переменная типа Справочник.Материалы должна создаваться с помощью
вызова системной функции СоздатьОбъект():
Спр=СоздатьОбъект("Справочник.Материалы");
Далее
переменная
Справочник.Материалы,
Спр
пока
является
еще
ссылкой
пустой.
на
объект
Следующий
типа
шаг
–
позиционирование ссылки на реальный элемент справочника. Это можно
сделать с помощью создания нового элемента справочника, поиска элемента
справочника по его коду или наименованию, инициации перебора элементов
справочника.
Перечислим основные виды действий, которые выполняются при
решении различных задач с участием справочников.
1. Создание нового элемента справочника.
Спр=СоздатьОбъект("Справочник.Материалы");
Спр.Новый();
37
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Спр.Наименование="Пряжа синтетическая" ;
Спр.Записать();
Для начала требуется создать новый пустой элемент справочника –
этим занимается процедура Новый(). Далее можно заполнять все его
реквизиты конкретными значениями. Вся эта работа будет выполняться в
оперативной памяти. Поэтому последний этап – фиксация всех сделанных
изменений на диск с помощью процедуры Записать().
Аналогично создается и новая группа внутри справочника. В этом
случае вместо процедуры Новый() должна использоваться процедура
НоваяГруппа(). Проверить, является ли некоторый элемент справочника
группой, можно с помощью метода ЭтоГруппа(). Метод вернет 1, если этот
элемент справочника является группой.
2. Поиск элемента справочника.
Для поиска элемента справочника в зависимости от критерия поиска
используются
НайтиПоКоду
функции
НайтиЭлемент(ЭлементСправочника),
(КодЭлемента),
(НаименованиеЭлемента),
НайтиПоНаименованию
НайтиПоРеквизиту
(ИмяРеквизита,
ЗначениеРеквизита) (имя реквизита в последней функции указывается в
ковычках). Все функции возвращают 1, если элемент найден. Найденный
элемент становится текущим в справочнике и ссылку на него можно будет
получить с помощью функции ТекущийЭлемент(). Например, требуется
найти материал с наименованием "Пряжа шерстяная".
Спр=СоздатьОбъект("Справочник.Материалы");
Если Спр.НайтиПоНаименованию("Пряжа шерстяная")=1 Тогда
Предупреждение("Найденный элемент справочника "+
"имеет код "+Спр.ТекущийЭлемент().Код);
38
Программирование в среде 1С:Предприятие
Иначе
Предупреждение("Элемент с заданным наименованием "+
"не найден");
КонецЕсли;
3. Удаление элемента справочника.
Поскольку информация, хранящаяся в системе, имеет зачастую очень
большое значение, то удаление производится в два этапа – установка
пометки на удаление (которую можно будет впоследствии снять) и
собственно удаление. Удалить элемент справочника, на который установлена
переменная Спр, можно так:
Спр.Удалить(1);
//собственно удаление элемента
Установить пометку на удаление элемента справочника можно так:
Спр.Удалить(0);
//пометка элемента на удаление
//впоследствии можно снять установленную пометку удаления
Спр.СнятьПометкуУдаления();
Узнать, установлена ли на некоторый элемент справочника пометка на
удаление, можно с помощью метода ПометкаУдаления(), который
возвращает 1, если пометка на удаление была установлена на этом элементе.
Физическое (необратимое) удаление всех элементов конфигурации, на
которые поставлены пометки, можно выполнить с помощью упаковки
данных (меню Операции – Удаление помеченных объектов…).
4. Перебор элементов справочника.
Для
начала
нужно
инициализировать
выборку элементов,
т.е.
сформировать выборку и установить курсор на ее начало. Это делает
процедура ВыбратьЭлементы(). Далее движение по выборке и получение
39
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
информации
об
элементах
справочника
осуществляется
функцией
ПолучитьЭлемент(), которая сдвигает курсор на следующий элемент и, если
он существует, вернет 1, в противном случае – 0. После помещения курсора
на элемент справочника получить доступ к нему можно с помощью функции
ТекущийЭлемент(). Например, требуется просмотреть все элементы
справочника и показать их наименования:
Спр=СоздатьОбъект("Справочник.Материалы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Предупреждение(Спр.ТекущийЭлемент().Наименование);
КонецЦикла;
5. Перебор элементов справочника внутри заданного родителя.
В этом случае алгоритм будет точно таким же, что и при полном
переборе справочника, за исключением одного предварительного шага.
Требуется до инициализации выборки установить конкретного родителя (т.е.
группу), внутри которого будет осуществляться поиск. Для этих целей можно
использовать следующую последовательность действий:
Спр=СоздатьОбъект("Справочник.Материалы");
СпрГруппа=СоздатьОбъект("Справочник.Материалы");
СпрГруппа.НайтиПоНаименованию("Топливо");
Спр.ИспользоватьРодителя(СпрГруппа.ТекущийЭлемент());
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Предупреждение(Спр.ТекущийЭлемент().Наименование);
КонецЦикла;
6. Перебор элементов подчиненного справочника.
При работе с подчиненным справочником (например, при переборе или
поиске элементов) требуется указать, для какого конкретно элементавладельца получать подчиненные элементы. Для этого предназначена
40
Программирование в среде 1С:Предприятие
процедура ИспользоватьВладельца(ОбъектВладелец) агрегатного типа
данных Справочник. На примере перебора всех моделей заданной марки
сотовых телефонов это выглядело бы так:
Спр=СоздатьОбъект("Справочник.Модели");
СпрМарка=СоздатьОбъект("Справочник.Марки");
СпрМарка.НайтиПоНаименованию("SАMSUNG");
Спр.ИспользоватьВладельца(СпрМарка.ТекущийЭлемент());
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Предупреждение(Спр.ТекущийЭлемент().Наименование);
КонецЦикла;
41
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Глава 3. Работа с планом счетов.
Для создания нового плана счетов нужно в окне конфигурации выбрать
элемент Планы счетов, вызвать контекстное меню и выбрать пункт Новый
План счетов.
Счета бухгалтерского учета могут иметь субсчета (т.е. могут являться
группой счетов). Тогда они будут отображаться с помощью желтой
пиктограммы. В противном случае счета будут отображаться в плане счетов с
помощью голубой пиктограммы. Аналогичная пиктограмма используется для
субсчетов. Следует сразу заметить, что если счет имеет субсчета, то он не
может участвовать в построении проводки бухгалтерского учета. Проводки
строятся только на основании его субсчетов.
Могут или нет счета плана счетов иметь субсчета, в частности, может
задаваться с помощью шаблона кода. По умолчанию шаблон кода
“###.###”. Это означает, что счет может иметь субсчета, но субсчета не
могут разделяться на субсчета более мелкого типа. В качестве символов для
обозначения кода счета могут использоваться любые символы (#).
После создания самого плана счетов с помощью кнопок Insert и Delete,
а также меню Действия можно добавлять, удалять и редактировать счета
внутри плана счетов в режиме конфигурирования.
Щелкнув мышью на элементе конфигурации Планы Счетов, можно
получить диалог свойств всех планов счетов, существующих в системе. Здесь
устанавливается, в частности, максимальная длина кода счета, максимальная
длина наименования счета, используется ли количественный учет. Поскольку
конфигурация может иметь несколько планов счетов, здесь можно назначить
основной план счетов конфигурации, т.е. тот план счетов, который будет
использоваться по умолчанию. Можно редактировать форму списка плана
счетов и форму счета. Но что наиболее важно, здесь задается максимальное
число субконто, которое может быть прикреплено к счетам планов счетов.
После задания некоторого количества субконто, в списке счетов появятся
42
Программирование в среде 1С:Предприятие
столбцы, соответствующие субконто. В этих столбцах с помощью списка
существующих видов субконто можно выбрать именно тот вид субконто,
который должен быть прикреплен к конкретному счету.
После создания плана счетов появляется новый тип данных,
соответствующий счету из созданного плана счетов. Если план счетов был
создан с идентификатором ОснПланСчетов, то новый агрегатный тип
данных будет называться Счет. ОснПланСчетов.
Перечислим основные атрибуты нового агрегатного типа данных
Счет. ОснПланСчетов:

Код–полный код бухгалтерского счета (КодСчета.КодСубсчета);

Наименование – название счета;

Количественный
–
равен
1,
если
по
счету
ведется
количественный учет, 0 – в противном случае;

Валютный – равен 1, если по счету учет ведется в валюте, 0 – в
противном случае;

Забалансовый – равен 1, если счет является забалансовым, 0 – в
противном случае;

Активный – равен 1, если счет активный, 2 – если счет
пассивный, 3 – если счет активно-пассивный.
Также этот агрегатный тип данных имеет ряд полезных методов.

Для определения, является ли счет группой, т.е. имеет ли счет
субсчета, используется метод ЭтоГруппа(), возвращающий 1, если счет
имеет субсчета, 0 – в противном случае.

Для определения, имеет ли счет субконто и в каком количестве,
можно использовать функцию КоличествоСубконто(), которая возвращает
количество видов субконто, прикрепленных к счету, или 0, если таковых нет.

Функция Уровень() агрегатного типа данных возвращает номер
уровня счета. Сами счета имеют уровень 1, их субсчета – 2 и т.д.

Функция
ВидСубконто(УровеньСубконто)
возвращает
наименование вида субконто уровня, заданного с помощью параметра,
43
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
прикрепленного к заданному счету, т.е. имея счет, можно получить
наименования всех видов субконто, прикрепленных к данному счету.

Проверить, позиционирована ли переменная на конкретном счете
плана счетов, можно с помощью функции Выбран(), возвращающей 1 в
случае положительного ответа.
Для создания нового счета программным способом существует метод
Новый() типа данных Счет. ОснПланСчетов, который получает в качестве
параметра 1, если счет будет иметь субсчета, и 0 в противном случае. После
вызова этого метода создается пустой счет, атрибуты которого можно
заполнить. В конце требуется запомнить все изменения, сделанные с новым
счетом, с помощью процедуры Записать().
Полный перебор счетов из плана счетов может осуществляться с
помощью
следующего
алгоритма,
аналогичного
алгоритму
перебора
элементов справочника, документов и прочих элементов конфигурации.
Счет=СоздатьОбъект("Счет.ОснПланСчетов");
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
//обработка информации о текущем счете
КонецЦикла;
Поиск счета лучше осуществлять по его коду с помощью функции
НайтиПоКоду(КодСчета), которая возвращает 1, если счет найден, 0 – в
противном случае. При успешном поиске найденный счет становится
текущим в плане счетов и ссылку на него можно получить с помощью
функции ТекущийСчет(). Кроме того, по коду счета можно получить счет с
помощью системной функции СчетПоКоду(КодСчета, ПланСчетов) (не
является методом агрегатного типа данных). Код счета задается как
символьная строка. Если не указан план счетов, используется основной план
счетов конфигурации.
44
Программирование в среде 1С:Предприятие
Глава 4. Работа с документами
Пример – документ «Ввод начальных остатков»
После создания в конфигурации плана счетов и справочников для
хранения информации об объектах аналитического учета можно приступать к
вводу информации о наличии средств и обязательств предприятия. Конечно,
система 1С:Предприятие имеет средства для введения бухгалтерских
проводок в информационную базу вручную. Однако основным средством
создания проводок считается создание документов. Это объясняется одним
из требований к бухгалтерскому учету (согласно закону о бухгалтерском
учете): каждая проводка делается на основании первичного документа, т.е.
документ является обоснованием хозяйственной операции.
Разберем этапы создания документа и основные связанные с этим
понятия на примере создания документа, который будет отражать
информацию об остатках на счетах на дату начала периода работы
предприятия, т.е. данный документ фактически отвечает за создание
начального баланса.
В системе 1С:Предприятие принят следующий алгоритм ввода
начальных остатков. В плане счетов должен существовать счет с номером 00
– Вспомогательный (активно-пассивный счет). Используется этот счет
таким образом:

если вводится остаток активного счета (например, счета 10), то
делается проводка Д 10 – К 00 (конечно, с учетом субсчетов и объектов
аналитики);

если же вводу подлежит остаток пассивного счета (например,
счета 80), то соответствующая проводка Д 00 – К 80.
45
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Таким образом, документ Ввод начальных остатков должен
предоставлять возможность сделать произвольное количество проводок с
участием счета 00.
Любой документ имеет шапку и табличную часть. Реквизитами шапки
являются те реквизиты, которые относятся ко всему документу в целом
(например, дата документа, номер, наименование поставщика, если речь идет
о поставке материалов). Табличная часть содержит реквизиты, касающиеся
информации о повторяющихся объектах документа. Например, если
рассматривается поставка материалов, то реквизитами табличной части будут
свойства каждого вида материала в отдельности (наименование материала,
цена,
количество
единиц
в
партии).
Значения
реквизитов
обычно
устанавливаются с помощью формы документа.
При создании документа система предлагает привязать документ к
журналу документов. Здесь можно выбрать существующий журнал или
создать новый журнал документов. Журналы документов являются удобным
средством для группировки документов разных типов, близких по
экономическому смыслу (например, журнал для кассовых документов). В
системе по умолчанию уже существуют два журнала – Полный и Прочие.
Первый журнал содержит все документы конфигурации, второй – только те
документы, для которых нет специализированных журналов.
Обращение к форме документа осуществляется с помощью кнопки
Форма на диалоге конфигурирования создаваемого документа. Форма
предназначена для ввода исходных данных хозяйственной операции,
основанием которой является документ.
Создание формы документа осуществляется с помощью трех основных
частей: Диалог – здесь программист может в удобном порядке расположить
элементы управления, как связанные с реквизитами документа, так и
выполняющие
некоторую
вспомогательную
роль;
Модуль
–
это
программный модуль, в котором указываются процедуры и функции,
используемые при обработке событий формы документа; Таблица – этот
46
Программирование в среде 1С:Предприятие
раздел существует для того, чтобы сформировать печатную форму
документа.
Напомним, что все элементы конфигурации, связанные с созданием
формы (обработки, отчеты, справочники и пр.) имеют те же три составные
части, что и форма документа. Последняя из них – Таблица – наиболее
востребована при создании отчетов.
Документ содержит два программных модуля: модуль документа и
модуль формы документа. Модуль формы документа содержит процедуры
обработки событий элементов управления и другие процедуры и функции,
которые можно выполнять, пока форма присутствует на экране. Процедуры и
функции модуля документа выполняются после закрытия формы. Именно
они предназначены для изменения состояния информационной базы с учетом
данных этого документа. Типичной процедурой, определенной в модуле
документа, является процедура ОбработкаПроведения(), вызов которой
происходит при нажатии на кнопку ОК. Цель этой процедуры - создать
проводки, соответствующие данному документу.
Итак, что придется проделать при создании документа Ввод
начальных остатков.
1. Реквизиты шапки документа дополнительно создавать не требуется.
По умолчанию каждый документ уже имеет два реквизита шапки –
НомерДок, ДатаДок (номер и дата документа, соответственно).
2. Реквизитами табличной части должны быть свойства проводок: счет
по дебету, субконто по дебету (если есть), счет по кредиту, субконто по
кредиту (если есть), количество (если по одному из участвующих счетов
ведется количественный учет), сумма.
3. Наш документ должен иметь форму. Примерный вид формы
изображен на рис. 4.1.
Установить
элементы
управления,
соответствующие
реквизитам
документа, можно с помощью последней кнопки на панели инструментов для
диалога:
47
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
4. Требуется отметить флажок Бухгалтерский учет в диалоге
конфигурирования создаваемого документа. В этом случае документу будет
соответствовать объект агрегатного типа данных Операция, который
является единственным средством создания проводок.
Рис.4.1. Форма документа «Ввод начальных остатков»
5. При создании документа Ввод начальных остатков существует
одна существенная проблема – это определение, какого типа субконто
должно быть по дебету или по кредиту каждой проводки. Если для хранения
счета
по
дебету
или
по
кредиту
хорошо
подходит
тип
данных
Счет.ОснПланСчетов, то для хранения субконто тип данных сразу указать
нельзя. Действительно, если будет использоваться счет 01 (Основные
средства), то типом данных для соответствующего субконто должен быть
Справочник.ОсновныеСредства,
(материалы),
то
соответствует
если
ему
48
же
тип
рассматривается
данных
для
счет
10
субконто
Программирование в среде 1С:Предприятие
Справочник.Материалы. Наконец, существуют счета, по которым нет
никакого субконто.
Поэтому тип данных реквизитов, отвечающих за субконто, должен
быть выбран как Неопределенный (такой тип есть в списке типов данных).
Определяться конкретный тип субконто будет позже, в момент выбора счета,
соответствующего этому субконто.
Назначение
конкретного
Неопределенный
производится
типа
с
данных
помощью
НазначитьТип(ИмяРеквизита,ТипДанных).
реквизиту
системной
Здесь
типа
процедуры
ИмяРеквизита
–
строка с именем реквизита неопределенного типа, ТипДанных – строка с
наименованием назначаемого типа данных.
На колонку, в которой будет выбираться счет (по дебету или по
кредиту), нужно назначить вызов пользовательской процедуры. Цель этой
процедуры – проанализировать, имеет ли выбранный счет субконто, и
установить тип данных для соответствующего реквизита табличной части
документа.
Пусть имеется реквизит СчетДебет типа Счет.ОснПланСчетов и он
позиционирован на конкретном счете плана счетов. Соответствующий ему
реквизит СубконтоДебет
имеет тип данных Неопределенный. Тогда
процедура может иметь вид:
Процедура НазначениеСубконтоДебет()
Если СчетДебет.КоличествоСубконто()>0 Тогда
// назначение конкретного типа реквизиту СубконтоДебет
НазначитьТип ("СубконтоДебет",
"Справочник."+СчетДебет.ВидСубконто(1));
КонецЕсли;
КонецПроцедуры
Назначение типа данных для реквизита субконто позволит выбирать из
соответствующего справочника конкретный объект аналитического учета.
49
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
6. Еще один вспомогательный вопрос, который требуется решить –
осуществление перебора строк табличной части документа. Это требуется
использовать практически во всех документах, поскольку каждой строке
табличной части документа должен соответствовать свой набор проводок.
Позиционирование на конкретной строке и сдвиг на следующую строку
табличной части документа организует следующий цикл:
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
//обработка строки табличной части документа
КонецЦикла;
или
Для Инд=1 По КоличествоСтрок() Цикл
ПолучитьСтрокуПоНомеру(Инд);
//обработка строки табличной части
КонецЦикла;
7. Обработка проведения документа. Обсудим теперь работу,
которую требуется проделать в модуле документа. Здесь требуется написать
процедуру ОбработкаПроведения(), в которой осуществляется генерация
проводок по данному документу.
Объект типа Документ имеет атрибут агрегатного типа данных
Операция с одноименным идентификатором Операция. Операция может
состоять из нескольких проводок (например, операция по начислению
заработной платы персоналу может содержать проводки собственно
начисления заработной платы, а также начисления подоходного налога, ЕСН
и других отчислений). В каждый конкретный момент объект Операция
позиционирован на одной из своих проводок.
50
Программирование в среде 1С:Предприятие
При позиционировании объекта Операция на проводке объект имеет
атрибуты Дебет и Кредит, каждый из которых имеет в свою очередь атрибут
Счет. Таким образом, задав значение атрибута Счет, можно указать счет по
дебету и счет по кредиту текущей проводки объекта Операция.
Аналогично,
объекты
Дебет
и
Кредит
имеют
атрибуты,
соответствующие объекту аналитики, по которому проводится операция, т.е.
субконто. Например, если мы обращаемся к счету 01, который имеет
субконто
ОсновныеСредства,
то
назначить
конкретный
объект
аналитического учета (например, конкретный станок) можно так:
Спр=СоздатьОбъект("Справочник.ОсновныеСредства");
// позиционирование объекта Спр на конкретный
// элемент справочника
Операция.Дебет.ОсновныеСредства=Спр.ТекущийЭлемент();
Если
программисту
неизвестно,
какой
вид
субконто
нужно
использовать при выполнении операции, то можно воспользоваться методом
Субконто(Уровень, Значение) объектов Дебет и Кредит, первый параметр
которого означает уровень субконто (независимо от типа), второй – значение
субконто, т.е.объект аналитического учета (чаще всего элемент справочника).
Тогда назначение субконто, например, по дебету, будет выглядеть так:
Спр=СоздатьОбъект("Справочник.ОсновныеСредства");
// позиционирование объекта спр на конкретный
// элемент справочника
Операция.Дебет.Субконто(1,Спр.ТекущийЭлемент());
Кроме того, объект Операция содержит другие атрибуты текущей
проводки – Количество, Содержание, Сумма.
Для
генерации
проводок
и
их
дальнейшего
анализа
можно
воспользоваться следующими методами агрегатного типа данных Операция.
51
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова

Создание новой проводки внутри объекта Операция происходит
с помощью процедуры:
Операция.НоваяПроводка();
После этого можно заполнять значения атрибутов проводки.

По завершении создания или модификации операции требуется
зафиксировать все изменения, которые были произведены с объектом
Операция. Это делается с помощью вызова метода Записать().
Операция.Записать();

Перебор всех проводок операции можно осуществить по
следующему алгоритму (аналогичному алгоритму перебора элементов
справочника или счетов из плана счетов):
Операция.ВыбратьПроводки();
Пока Операция.ПолучитьПроводку()=1 Цикл
// обработка данных проводки
КонецЦикла;
Переход на проводку с заданным номером можно осуществить с
помощью
метода
ПолучитьПроводкуПоНомеру(Номер_Проводки)
агрегатного типа данных Операция, которая позиционирует объект
Операция на проводке с заданным номером и возвращает 1, если такая
проводка существует, 0 – в противном случае.
Количество проводок в операции можно получить с помощью метода
КоличествоПроводок() агрегатного типа данных Операция. Поэтому цикл
перебора проводок операции можно организовать и по следующей схеме:
52
Программирование в среде 1С:Предприятие
Для Инд=1 по Операция.КоличествоПроводок() Цикл
Операция.ПолучитьПроводкуПоНомеру(Инд);
// обработка данных проводки
КонецЦикла;
Номер текущей проводки можно получить с помощью метода
НомерПроводки() агрегатного типа данных Операция.
Пример – документ «Поступление материалов»
Сама процедура поступления материалов на склад предприятия может
включать в себя несколько этапов. В одном из случаев на склад поступают
материалы от поставщика и соответствующий счет-фактура, однако нередко
счет-фактура приходит несколько позднее. Эти два случая должны
различаться по своему оформлению с точки зрения бухгалтерских проводок.
В первом случае на сумму стоимости материалов делается проводка Д10 –
К60, а затем учитывается НДС (18%) проводкой Д19 – К 60. Во втором
случае вторая проводка делается только после получения счета-фактуры.
Таким образом, покупка материалов должна обрабатываться двумя
документами – поступление материалов (например, с идентификатором
ПоступлениеМатериалов)
и
получение
счета-фактуры
(к
примеру,
ВводНДС), второй из которых начисляет НДС на основании первого
документа. Процесс разработки второго документа будет обсуждаться в
следующих разделах.
Опишем процесс создания документа ПоступлениеМатериалов.
1. Создадим реквизиты шапки документа. В качестве реквизита
шапки документа, помимо существующих по умолчанию НомерДок,
ДатаДок, можно ввести ссылку на поставщика, от которого поступают
материалы (очевидно, тип данных для этого реквизита должен быть
Справочник.Контрагенты). Еще один реквизит шапки должен указывать на
53
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
то, что по данному документу был проведен НДС (в случае просмотра
существующего документа) или должен быть проведен НДС (в случае
создания нового документа). Назовем этот реквизит ВыпискаНДС (на форме
этот реквизит удобнее всего отобразить с помощью элемента управления
"Флажок").
2. Табличная часть документа должна содержать список материалов,
которые включаются в поставку с указанием количества, цены единицы и
суммы. Таким образом, реквизитами табличной части документа можно
сделать реквизиты с идентификаторами Материал, Количество, Цена,
Сумма.
3. Далее спроектируем форму для документа (рис.4.2).
4. Кнопка Печать документа должна инициировать вывод документа
для последующей печати (т.е. вывод в таблицу, прикрепленную к данному
документу). Конечно, большинство документов имеют стандартизованные
печатные формы. Однако в целях изучения мы рассмотрим упрощенные
варианты таких печатных форм (рис.4.3).
Рис.4.2. Форма документа «Поступление материалов»
54
Программирование в среде 1С:Предприятие
Вопрос о том, как производится печать данных документа, подробно
будет рассмотрен в главе, посвященной созданию отчетов. Кратко это можно
сформулировать так.
Закладку печатной формы Таблица можно переименовать. Назовем ее,
к примеру, Поступление материалов.
Требуется
на
закладке
Поступление
материалов
определить
структуру секций, из которых будет сформирован результат (рис.4.4).
Рис.4.3. Печатная форма документа
«Поступление материалов»
Здесь в квадратных скобках указываются реквизиты документа,
идентификаторы переменных и прочие программные элементы. В частности,
формулировка
[Материал.ЕдИзмерения]
в
секции
Заказ
означает
обращение к реквизиту ЕдИзмерения объекта Материал, который имеет
тип данных
Справочник.Материалы. В свойствах ячеек, содержащих
данные, требуется указать тип Шаблон.
Рис.4.4. Структура секций печатной формы документа
«Поступление материалов»
55
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
В модуль формы документа поместим пользовательскую процедуру
Печать(), вызов который укажем в поле Формула как реакцию на нажатие
кнопки Печать документа. Текст процедуры будет следующим:
Процедура Печать()
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Поступление материалов");
Таб.ВывестиСекцию("Заголовок");
Таб.ВывестиСекцию("Поставщик");
Для Инд=1 по КоличествоСтрок() Цикл
ПолучитьСтрокуПоНомеру(Инд);
Таб.ВывестиСекцию("Заказ");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать();
КонецПроцедуры
Кратко эту процедуру можно объяснить так: создается объект таблицы
вывода информации и привязывается к шаблону, находящемуся на вкладке
Поступление материалов. Далее в эту таблицу выводятся сначала секции
Заголовок и Поставщик, а затем секция Заказ для каждой строки
табличной части документа. Для того чтобы увидеть результат на экране, для
таблицы вызывается метод Показать().
5.
Далее обсудим моменты, связанные с проведением документа.
Вспомним, что для создания одной проводки требуется выполнить несколько
операторов: создать новую проводку, записать счет дебета, записать счет
кредита, записать сумму, записать количество, записать значения субконто
по дебету и по кредиту, если таковые есть. Таким образом, на создание одной
проводки требуется от 4 до 7 операторов. Одним из способов упростить
схему создания проводок в документах является создание процедуры
глобального модуля, которая бы выполняла минимальную работу по
созданию проводки. Вид такой процедуры может быть следующим:
56
Программирование в среде 1С:Предприятие
Процедура Проводка(Опер,СчетД, СчетК, Сумма) экспорт
Опер.НоваяПроводка();
Опер.Дебет.Счет=СчетПоКоду(СчетД);
Опер.Кредит.Счет=СчетПоКоду(СчетК);
Опер.Сумма=Сумма;
КонецПроцедуры
Эту процедуру нужно поместить в Глобальный модуль, доступ к
которому можно получить, находясь в окне Конфигурация, через меню
Действия - Глобальный модуль. Ключевое слово экспорт здесь указывает
на тот факт, что процедура является доступной для всех модулей
конфигурации. Первый параметр является ссылкой на объект Операция, для
которой создается проводка. Напомним, что параметры в процедуры и
функции по умолчанию передаются по ссылке, т.е. менять значения
переменных и объектов можно, и эти изменения будут сохранены. Второй и
третий параметры – строки с номерами счетов дебета и кредита проводки.
После создания процедуры Проводка() в процедуре модуля документа
ОбработкаПроведения() осталось указать только то, что не присуще всем
проводкам без исключения – количество:
Операция.Количество=Количество;
и объекты субконто.
6.
Таким образом, текст процедуры ОбработкаПроведения()
модуля документа будет таков:
Процедура ОбработкаПроведения()
// просмотр всех строк табличной части
Пока ПолучитьСтроку()=1 Цикл
Проводка(Операция, "10", "60", Сумма);
// установка субконто для проводки Д10 – К60
57
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Операция.Дебет.Материалы=Материал;
Операция.Кредит.Контрагенты=Поставщик;
Операция.Количество=Количество;
//проведение НДС, если необходимо
Если ВыпискаНДС=1 Тогда
Проводка(Операция,"19", "60", Сумма*0.18);
Операция.Кредит.Контрагенты=Поставщик;
КонецЕсли;
КонецЦикла;
//в конце требуется зафиксировать все изменения
Операция.Записать();
КонецПроцедуры
Работа с документами в программном модуле
Система 1С:Предприятие имеет базовый агрегатный тип данных –
Документ, от которого наследуются агрегатные типы данных конкретных
видов документов. Например, созданный в предыдущем разделе документ
ПоступлениеМатериалов инициирует создание нового агрегатного типа
данных – Документ.ПоступлениеМатериалов, который наследует все
атрибуты и методы агрегатного типа данных Документ.
Перечислим основные действия, которые можно производить с
документами программным способом.
1.
Перебор документов. Перебор документов можно осуществить
по такой же схеме, как и перебор элементов справочника.
Док=СоздатьОбъект("Документ.ПоступлениеМатериалов");
// параметры - даты начала и конца периода
// просмотра документов
Док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
Пока Док.ПолучитьДокумент()=1 Цикл
// обработка данных текущего документа,
// получаем которые через Док.ТекущийДокумент()
КонецЦикла;
58
Программирование в среде 1С:Предприятие
В данном примере выбираются только документы определенного
типа. В случае, когда требуется обработать документы всех типов, при
создании объекта нужно указать базовый агрегатный тип данных Документ.
2.
Поиск документов. Для поиска документов можно использовать
функцию НайтиПоНомеру(Номер, Дата, ИдентВида) агрегатного типа
данных Документ. Здесь первый параметр – номер документа, второй
параметр – дата из диапазона поиска (на некоторых предприятиях нумерация
документов начинается заново каждый год), третий параметр – строковое
выражение идентификатора вида документа (если ищется документ с
помощью переменной базового типа данных Документ). Если переменная
имела тип, соответствующий конкретному виду документа, то третий
параметр не нужен. Если нет ограничений на дату документа, то в качестве
второго параметра требуется указать Дата(0). Функция возвращает 1, если
документ будет найден и переменная позиционирована на нем.
Например, требуется найти документ ПоступлениеМатериалов с
номером 5 и вывести наименование поставщика по этому документу. Это
делает следующий код:
Док=СоздатьОбъект("Документ.ПоступлениеМатериалов");
Если Док.НайтиПоНомеру(5,Дата(0))=1 Тогда
Поставщик= Док.ТекущийДокумент().Поставщик.Наименование;
Предупреждение(Поставщик);
КонецЕсли;
Ввод документа на основании другого документа.
Иногда бывает необходимо создавать документы, которые являются
дополнением
к
некоторым
основным
документам.
Такое
создание
документов называют вводом документа на основании другого документа.
Данные для формирования вводимых на основании документов частично или
59
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
полностью берутся из документа-основания. Ввести такой документ можно с
помощью контекстного меню в журнале документа – требуется выбрать
документ-основание, вызвать для него контекстное меню, выбрать пункт
Ввести на основании, выбрать тип создаваемого документа.
При создании документов, вводимых на основании, требуется
учитывать следующие факторы.
Во-первых, при создании документа, вводимого на основании другого,
нужно указать, на основании какого вида документа он будет вводиться. В
диалоге свойств документа размещена кнопка Ввод на основании... . Она
вызывает диалог вида, изображенного на рис.4.5. В диалоге можно указать,
выбрав соответствующие флажки, основанием каких документов может
являться создаваемый документ, а также, на основании каких документов
может вводиться он сам.
Рис.4.5. Диалог определения основания для ввода документов
Каждый документ может быть создан двумя способами – как
самостоятельный документ и на основании другого документа. В первом
случае системой вызывается предопределенная процедура ВводНового()
агрегатного типа данных Документ. В случае ввода на основании другого
документа системой будет вызываться другая предопределенная процедура
60
Программирование в среде 1С:Предприятие
ВводНаОсновании(ДокОсн), имеющая в качестве параметра ссылку на
документ-основание. Обе эти процедуры при переопределении должны
находиться в модуле формы документа, поскольку должны вызываться до
создания окна формы документа.
Зачастую документы, вводимые на основании других документов, не
должны создаваться как самостоятельные. Запрет на независимое создание
документа можно осуществить с помощью переопределения процедуры
ВводНового(). В ней требуется лишь вызвать системную процедуру:
СтатусВозврата(0);
Вызов этой процедуры инициирует выход из текущей процедуры (в
данном
случае
из
процедуры
ВводНового()).
Параметр
процедуры
указывает, успешно (1) или безуспешно (0) сработала процедура. Поскольку
создание документа должно быть запрещено, то указывается в качестве
параметра 0, и документ не будет создан.
Пример – документ «Проведение НДС»
Напомним, что поступление материалов обрабатывается обычно двумя
документами – поступление материалов, создание которого обсуждалось в
предыдущих разделах, и получение счета-фактуры (с идентификатором, к
примеру, ВводНДС), который начисляет НДС на основании первого
документа. Создание второго документа рассмотрим в данном разделе.
Во-первых, зададим, что основанием документа ВводНДС является
документ ПоступлениеМатериалов (кнопка Ввод на основании...).
Переопределим в модуле формы документа две предопределенные
процедуры:
61
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Процедура ВводНового()
Предупреждение("Создание документа может быть только "+
"на основании другого документа");
СтатусВозврата(0);
КонецПроцедуры
Процедура ВводНаОсновании(ДокОсн)
Если ДокОсн.Вид()="ПоступлениеМатериалов" Тогда
Если ДокОсн.ВыпискаНДС=0 Тогда
НомерОсн=ДокОсн.НомерДок;
Иначе
Предупреждение("НДС по данному документу уже "+
"проведен");
СтатусВозврата(0);
КонецЕсли;
Иначе
Предупреждение("Для данного типа документа "+
"начисление НДС не предусмотрено");
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры
Одна из целей второй процедуры – проверить, что документ имеет
правильное основание (пользователь может попытаться ввести документ
ВводНДС на основании, например, документа ВводНачальныхОстатков).
При использовании неправильного основания требуется запретить создание
документа.
Вторая цель – проверить, был ли начислен НДС по документуоснованию.
Для
этого
требуется
проверить
значение
реквизита
ВыпискаНДС документа ПоступлениеМатериалов. Напомним, что он
равен 1, если НДС проведен, т.е. счет-фактура был получен, и 0 – в
противном случае.
Третья цель – запомнить информацию о документе-основании. Дело в
том, что ссылка на документ-основание передается системой только в
62
Программирование в среде 1С:Предприятие
процедуру ВводНаОсновании(). Эта процедура вызывается еще до создания
документа ВводНДС, а данные из документа-основания нужны уже после
его создания. Поэтому требуется сохранить ссылку на документ-основание
внутри создаваемого документа. Одним из общепринятых способов является
создание реквизита шапки документа (например, с идентификатором
НомерОсн), в который сохраняется номер документа-основания. Далее,
когда потребуется получить данные из документа-основания, нужно будет
только осуществить поиск документа по этому номеру. Например, так это
будет сделано при проведении данного документа:
Процедура ОбработкаПроведения()
Док=СоздатьОбъект("Документ.ПоступлениеМатериалов");
Док.НайтиПоНомеру(НомерОсн, Дата(0));
Пока Док.ПолучитьСтроку()=1 Цикл
Проводка(Операция,"19","60",Док.Сумма*0.18);
Операция.Кредит.Контрагенты=Док.Поставщик;
КонецЦикла;
Операция.Записать();
Док.ВыпискаНДС=1;
Док.Записать();
КонецПроцедуры
После нахождения документа-основания требуется просмотреть все
строки его табличной части, сгенерировав для каждой из них проводку.
После просмотра всех строк требуется зафиксировать изменения, связанные с
операцией документа. Для генерации проводки используется разработанная
при обсуждении создания документа ПоступлениеМатериалов процедура
глобального модуля Проводка(). Наконец, после проведения документа
ВводНДС документ-основание уже не может быть основанием другого
документа, поскольку для него уже начислен НДС, т.е. нужно изменить
значение реквизита ВыпискаНДС документа-основания. Это и делается в
конце процедуры ОбработкаПроведения():
63
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Док.ВыпискаНДС=1;
//НДС уже проведен
//зафиксируем изменения документа-основания
Док.Записать();
Агрегатный тип данных «ТаблицаЗначений»
Агрегатный
тип
данных
ТаблицаЗначений
играет
в
системе
1С:Предприятие вспомогательную роль. Его главная цель – облегчить
работу с двумерными данными. Этот тип данных применяется в самых
различных элементах конфигурации. Ему соответствует элемент управления
Таблица Значений. В документе табличная часть также совместима с этим
типом данных. Наконец, при создании отчетов зачастую этот тип данных
незаменим, поскольку предоставляет легкие способы получения сводной
информации.
Одним из основных отличий типа данных ТаблицаЗначений от
обыкновенных двумерных массивов, используемых в других языках
программирования, является возможность именования столбцов (колонок)
таблицы и дальнейшее обращение к элементам колонки с помощью этого
имени.
Посредством
этого
свойства
агрегатный
тип
данных
ТаблицаЗначений позволяет имитировать работу с таблицей базы данных.
Пусть был создан объект агрегатного типа данных ТаблицаЗначений:
Таб=СоздатьОбъект("ТаблицаЗначений");
Этот объект пока является пустым. Поэтому далее следует создать
структуру таблицы, т.е. создать ее колонки. Это можно сделать с помощью
процедуры
НоваяКолонка(Идентификатор,
Тип,
Длина,
Точность,
Заголовок, Ширина) агрегатного типа данных ТаблицаЗначений. Первый
параметр процедуры – номер колонки или ее идентификатор в виде строки.
64
Программирование в среде 1С:Предприятие
Далее идут параметры, обозначающие тип данных для этой колонки: Тип –
название типа данных (указывается в виде строки), Длина – максимальная
длина содержимого колонки, Точность – число знаков после запятой (для
числовых данных). Последние два параметра отвечают за визуальное
представление колонки: Заголовок – текст в заголовке колонки, Ширина –
видимая ширина колонки (измеряется в количестве символов).
После создания структуры таблицы можно создавать строки таблицы.
Пустая строка создается с помощью процедуры НоваяСтрока(). Вновь
созданная строка становится текущей для таблицы значений. Поскольку
колонки таблицы имеют идентификаторы, можно напрямую записывать
значения в текущую строку таблицы, например,
Таб.Сотрудник="Иванов Иван Иванович";
Для того чтобы получить или установить значение в конкретную
ячейку таблицы значений, используются методы УстановитьЗначение
(Строка, Колонка, Значение), ПолучитьЗначение(Строка, Колонка)
агрегатного типа данных ТаблицаЗначений. Первый из этих методов в
ячейку таблицы с номерами строки и колонки, задаваемыми первыми двумя
параметрами, устанавливает значение, задаваемое третьим параметром.
Метод возвращает старое значение ячейки таблицы. Второй метод позволяет
получить значение ячейки таблицы по заданным номерам строки и колонки
этой ячейки.
Про перебор строк таблицы мы уже говорили, когда рассматривали
вопрос перебора строк табличной части документа. Здесь могут быть
использованы два подхода:
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
// обработка строки таблицы
КонецЦикла;
65
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
или
Для НомерСтроки = 1 По Таб.КоличествоСтрок() Цикл
Таб.ПолучитьСтрокуПоНомеру(НомерСтроки);
// обработка строки таблицы
КонецЦикла;
Удаление строк и колонок из таблицы может производиться с
помощью следующих процедур агрегатного типа данных ТаблицаЗначений:

Очистить() – производится удаление и всех строк, и всех
колонок таблицы.

УдалитьСтроки() – производится удаление только строк
таблицы. Колонки таблицы сохраняются.

УдалитьСтроку() – производится удаление текущей строки
таблицы.

УдалитьСтроку(номер) – производится удаление строки с
заданным номером из таблицы.

УдалитьКолонку(идентификатор) – производится удаление
колонки с заданным с помощью параметра номером или идентификатором.
Следующие возможности агрегатного типа данных ТаблицаЗначений
– это возможности по работе с таблицей для получения сводной информации
и манипулирования данными.
Сортировка строк таблицы осуществляется с помощью процедуры
Сортировать(). В качестве параметра используется строка,
содержащая
идентификатор колонки, по которой требуется отсортировать строки
таблицы. Если сортировка должна производиться по возрастанию значения, к
идентификатору добавляется символ "+", в противном случае – символ "-".
Можно производить сортировку по нескольким колонкам. Тогда в параметре
процедуры указываются через запятую все идентификаторы колонок, по
которым осуществляется сортировка. Например, если таблица содержит
66
Программирование в среде 1С:Предприятие
данные о сотрудниках (имеет колонки Должность и Оклад), можно
отсортировать строки таблицы по должности (по алфавиту) и по размеру
оклада (в порядке убывания). Это делается так:
Таб.Сортировать("Должность+,Оклад-");
Получение итоговой информации по колонке осуществляется с
помощью метода Итог(), которому в качестве параметра передается
идентификатор или номер колонки. Например,
СуммаЗарПлаты = Таб.Итог("Оклад");
Иногда требуется получить итоговую информацию с учетом
группировки строк по некоторым условиям. Чаще всего в качестве этого
условия выступают фиксированные значения другой колонки таблицы.
Фактически, такая задача решается, например, в языке SQL с помощью
запроса с использованием агрегирующих функций и конструкции GROUP
BY. В системе 1С:Предприятие для этих целей используют процедуру
Свернуть(ГруппКолонки,
ТаблицаЗначений.
Первый
СуммКолонки)
параметр
агрегатного
процедуры
типа
содержит
данных
значение
идентификатора или номера колонки, используемой в качестве основы для
группировки. Второй параметр – идентификатор или номер колонки,
значения которой суммируются с
учетом полученной группировки.
Результатом работы этой процедуры является свертывание исходной
таблицы таким образом, что в ней останутся только строки, соответствующие
полученным группам. Например, таблицу с данными о сотрудниках
требуется обработать так, чтобы получить группировку по отделу с
указанием суммарной заработной платы сотрудников отдела. Это можно
сделать так:
67
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Таб.Свернуть("Отдел","Оклад");
Можно группировать и получать итоги сразу по нескольким колонкам.
В этом случае требуется в качестве каждого из параметров указать строку, в
которой
через
запятую
перечислены
все
идентификаторы
колонок
группировки (для первого параметра) или колонок итогов (для второго
параметра).
Последнее, что хотелось бы упомянуть относительно агрегатного типа
данных ТаблицаЗначений – его связь с табличной частью документа.
Агрегатный тип данных Документ и, следовательно, все документы,
созданные
в
конфигурации,
имеют
две
процедуры,
позволяющие
осуществлять обмен данными своей табличной части и объекта агрегатного
типа данных ТаблицаЗначений.
Первая из процедур ВыгрузитьТабличнуюЧасть (ТаблицаЗнач,
Колонки) выгружает в объект агрегатного типа данных ТаблицаЗначений
содержимое колонок табличной части, указанных во втором параметре через
запятую. Если второй параметр не указан, то выгрузке подлежат все колонки
табличной части документа. Вторая процедура ЗагрузитьТабличнуюЧасть
(ТаблицаЗнач) загружает в табличную часть документа те данные, которые
хранятся
в
объекте
агрегатного
типа
данных
ТаблицаЗначений,
передаваемом в качестве параметра.
Пример – документ «Платежное поручение»
Рассмотрим
пример
применения
агрегатного
типа
данных
ТаблицаЗначений при создании документов.
Оплата поставок материалов, основных средств и других услуг,
предоставляемых предприятию, осуществляется по следующей схеме.
Например,
после
получения
материалов
68
выписывается
документ,
Программирование в среде 1С:Предприятие
называемый платежным поручением, который представляет собой поручение
банку перевести на счет поставщика определенную сумму. Проводок при
оформлении такого документа не делается, поскольку нет уверенности, что
банк
оплатит
это
поручение
в
момент
получения
документа.
Соответствующая проводка (Д 60 – К 51) будет сделана только на основании
выписки с расчетного счета, которую предприятие получит от банка.
Первым
реквизитов
этапом
проектирования
документа.
Конечно,
документа
можно
является
вводить
создание
документ
ПлатежноеПоручение на основании документа ПоступлениеМатериалов.
Однако мы изберем другой подход, может быть менее удобный, но
демонстрирующий иные программные и алгоритмические средства работы с
документами.
Пусть документ ПлатежноеПоручение создается как независимый и
одним из реквизитов этого документа является ссылка на документ типа
ПоступлениеМатериалов, по которому требуется произвести оплату. У
документа ПлатежноеПоручение табличной части нет, а реквизитами шапки
являются:

ДокМатериалы
типа
Документ.ПоступлениеМатериалов,
представляющий собой ссылку на документ, который будет оплачиваться;

Оплата типа данных Число;

Получатель типа Справочник.Контрагенты, хранящий ссылку
на поставщика, от которого поступили материалы;

СуммаДок типа данных Число, обозначающая сумму оплаты без
НДС.
Далее спроектируем форму документа. Из перечисленных реквизитов
выбору пользователя подлежит только первый из них – ДокМатериалы.
Остальные реквизиты будут заполнены автоматически на основании
выбранного документа.
Таким образом, на форме документа доступным для редактирования
должен быть только список выбора документа поставки материалов. Для
69
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
отображения информации о реквизитах, которые нельзя редактировать,
удобно создать не элементы управления, а метки (обязательно указать для
каждой из них идентификатор, например, Поставщик, Сумма, НДС).
Значения этих меток следует задавать программным образом с помощью
метода Заголовок(НовыйЗаголовок), например, при открытии документа
или при выборе документа поставки. Во втором случае актуализировать
данные с помощью метода Обновить() объекта Форма.
Таким образом, форма документа ПлатежноеПоручение будет иметь
следующий вид (рис.4.6).
Модуль документа ПлатежноеПоручение будет пустым, поскольку
создание проводок и проведение для него не предусмотрено. Все процедуры
и функции нужно помещать в модуль формы документа.
Первая процедура, которую требуется определить – процедура,
вызываемая при выборе документа ДокМатериалы. Цель этой процедуры –
прочитать и отобразить данные документа поставки – поставщика, сумму
поставки,
НДС.
Именно
здесь
требуется
создать
объект
типа
ТаблицаЗначений, который загружает табличную часть документа поставки
и получает сумму документа. Процедура эта может выглядеть следующим
образом:
Рис 4.6. Форма документа «Платежное поручение».
70
Программирование в среде 1С:Предприятие
Процедура Определение()
Перем Пост;
Таб=СоздатьОбъект("ТаблицаЗначений");
//заполнение данных из документа поставки
Пост="поставщику "+ДокМатериалы.Поставщик.Наименование+
" за материалы.";
//получение суммы документа
ДокМатериалы.ВыгрузитьТабличнуюЧасть(Таб);
СуммаДок=Таб.Итог("Сумма"); //итог колонки Сумма
//установка новых заголовков меток
Форма.Поставщик.Заголовок(Пост);
Форма.НДС.Заголовок("В том числе НДС в размере " +
(СуммаДок*0.18)+" рублей");
Форма.Сумма.Заголовок(""+СуммаДок+" рублей");
Получатель=ДокМатериалы.Поставщик;
КонецПроцедуры
Вызов процедуры Определение() должен производиться в момент
выбора документа поставки в соответствующем элементе управления на
форме документа. На этот элемент управления требуется назначить вызов
пользовательской процедуры. Можно, конечно, сразу вызвать процедуру
Определение(), однако существует несколько моментов, которые требуется
учитывать.
Существует несколько ситуаций, в которых создание документа не
должно производиться. Во-первых, если по факту поставки материалов не
был получен счет-фактура (тогда в документе поставки, которые мы
выбираем, реквизит ВыпискаНДС будет равен 0). Второй случай связан с
попыткой выбрать документ ПоступлениеМатериалов, по которому уже
было оформлено платежное поручение.
Чтобы осуществить проверку оплаты выбранной поставки, можно
написать функцию, которая будет просматривать все документы типа
ПлатежноеПоручение и проверять их на соответствие с документом
поставки создаваемого платежного поручения. Именно для этих целей мы
создали реквизит документа Оплата, принимающий значение 1, если
71
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
платежное поручение отправляется в банк, 0 – в противном случае (не
получен счет-фактура или уже оплачен документ поставки). Тогда функция
проверки оплаты может выглядеть так:
Функция ПроверкаОплаты()
Док=СоздатьОбъект("Документ.ПлатежноеПоручение");
//поиск уже выписанного платежного поручения
//по выбранному документу
//этот документ может появиться в промежуток
//времени от даты документа поставки до даты
// текущего платежного поручения
Док.ВыбратьДокументы(ДокМатериалы.ДатаДок, ДатаДок);
Пока Док.ПолучитьДокумент()=1 Цикл
//если в объекте док документ поставки тот же, что и в
// текущем документе и он был оформлен, возвращаем 1
Если (Док.ДокМатериалы.НомерДок =ДокМатериалы.НомерДок)
и (Док.Оплата=1) Тогда
Возврат 1;
КонецЕсли;
КонецЦикла;
Возврат 0; //таких документов не найдено
КонецФункции
Таким образом, процедура, вызываемая при выборе документа
поставки, может выглядеть так:
Процедура ПриВыборе()
//проверяем получение счета-фактуры по выбранной поставке
Если ДокМатериалы.ВыпискаНДС=0 Тогда
Предупреждение("По данному документу не получен счет-"+
"фактура. Документ не может быть "+
"оплачен.");
//документ не будет оплачен, нужно отменить
// выбор документа
Оплата=0; ДокМатериалы=0;
Иначе
// проверяем факт выписки платежного поручения
// по выбранному документу
72
Программирование в среде 1С:Предприятие
Если ПроверкаОплаты()=0 Тогда
Определение();
//отображаем данные
Форма.Обновить();
Оплата=1;
//документ будет оформлен
Иначе
Предупреждение("По этому документу уже было "+
"выписано платежное поручение");
Оплата=0; ДокМатериалы=0;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Последний
момент,
который
требует
обработки,
возникает
в
следующем случае. Предположим, что мы создали несколько документов
типа ПлатежноеПоручение и хотим просмотреть их данные. При открытии
формы существующего документа заголовки меток (Поставщик, Сумма,
НДС) окажутся пустыми, хотя документ поставки материалов будет выбран.
Чтобы отобразить данные документа, нужно заполнить заголовки меток до
момента показа формы документа на экране. Это можно сделать в процедуре
формы ПриОткрытии(). В ней, проанализировав выбор документа поставки
(это можно сделать с помощью функции Выбран() типа данных Документ,
которая возвращает 1 при фиксации объекта типа Документ на конкретном
документе), требуется заполнить данными документа поставки заголовки
всех
меток
платежного
существующего
поручения.
платежного
Таким
поручения
образом,
будут
при
отображаться
открытии
данные
соответствующего документа поставки материалов. При создании же нового
платежного поручения заголовки меток окажутся пустыми.
Процедура ПриОткрытии()
Если ДокМатериалы.Выбран()=1 Тогда
Определение();
КонецЕсли;
КонецПроцедуры
73
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Пример – документ «Выписка банка»
Основанием проведения всех операций с расчетным счетом (кроме
операций взаимодействия с кассой) является выписка с расчетного счета,
оформляемая банком с некоторой периодичностью. Создадим документ
ВыпискаБанка. Форма создаваемого документа может выглядеть так, как
изображено на рис.4.7.
Создание
собственных
реквизитов
шапки
документа
здесь
не
требуется. Главное содержание – это содержание табличной части, в которой
идет перечисление всех операций с расчетным счетом за заданный период
времени. На самом деле количество типов операций с расчетным счетом не
очень большое. Можно создать собственное Перечисление, назвав его
Назначение,
за
значения
которого
принять
ОплатаПоставки
и
ПоступлениеВыручки (это две самые распространенные операции с
расчетным счетом, при необходимости мы можем расширить список
значений перечисления).
Таким
образом,
ВыпискаБанка
реквизитами
должны
Перечисление.Назначение),
являться
табличной
назначение
части
документа
операции
(тип
счет
(тип
корреспондентский
Счет. ОснПланСчетов), субконто (тип Справочник.Контрагенты), приход
(тип Число) и расход (тип Число). Только один из последних двух
реквизитов может иметь ненулевое значение. Более того, в зависимости от
значения
реквизита
назначение
нужно
регулировать
доступность
редактирования этих столбцов таблицы. Если назначением операции
является ОплатаПоставки (проверить это можно с помощью условия
Назначение=Перечисление.Назначение.ОплатаПоставки),
то
столбец
Приход должен стать недоступным для редактирования. Это можно сделать
с помощью следующего вызова процедуры Доступность() для столбца
Приход объекта Форма:
74
Программирование в среде 1С:Предприятие
Форма.Приход.Доступность(0);
Рис.4.7. Форма документа «Выписка банка»
Вызов этой же процедуры с параметром 1 разрешает редактирование
соответствующего элемента управления. Аналогично, при выборе в качестве
назначения значения ПоступлениеВыручки недоступным должен стать уже
столбец Расход. Подчеркнем, что недоступность для редактирования здесь
распространяется только на текущую строку табличной части документа.
На столбец выбора типа операции с расчетным счетом требуется
назначить вызов процедуры, определяющей доступность столбцов Расход и
Приход.
Процедура РасходПриход()
Если (Назначение=Перечисление.Назначение.ОплатаПоставки)
Тогда
Форма.Приход.Доступность(0);
Форма.Расход.Доступность(1);
Приход=0;
75
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
КоррСчет=СчетПоКоду("60");
Иначе
Форма.Приход.Доступность(1);
Форма.Расход.Доступность(0);
Расход=0;
КоррСчет=СчетПоКоду("62");
КонецЕсли;
КонецПроцедуры
Оплата поставки осуществляется с помощью предварительного
оформления
документов
типа
ПлатежноеПоручение,
поэтому
целесообразно было бы дать возможность отбора документов, на основании
которых были проведены банковские операции.
Поместим на форму документа кнопку Отбор документов, каждое
нажатие на которую должно инициировать выбор документа типа
ПлатежноеПоручение и создание новой строки табличной части документа
ВыпискаБанка с данными из выбранного платежного поручения. Для этого
создаем пользовательскую процедуру, назвав ее, к примеру, Отбор(). Первый
шаг этой процедуры – выбор документа ПлатежноеПоручение. Создаем
объект типа Документ.ПлатежноеПоручение и вызываем для него функцию
Выбрать(ЗаголовокОкнаВыбора). Эта функция выводит на экран окно с
журналом документов, содержащим документы типа ПлатежноеПоручение.
Пользователь в этом окне может двойным щелчком выбрать нужный
документ. Если выбор будет успешным, функция вернет 1. Тогда требуется
создать новую строку табличной части документа ВыпискаБанка (это
делается с помощью вызова процедуры НоваяСтрока()). Далее следует
заполнение реквизитов данной строки (назначение, корреспондентский счет,
субконто, расход и приход), данные для которой берутся из выбранного
платежного поручения.
76
Программирование в среде 1С:Предприятие
Процедура Отбор()
Док=СоздатьОбъект("Документ.ПлатежноеПоручение");
Если Док.Выбрать("Выберите платежное поручение")=1 Тогда
НоваяСтрока();
Назначение=Перечисление.Назначение.ОплатаПоставки;
Субконто=док.Получатель;
Приход=0;
КоррСчет=СчетПоКоду("60");
Сумма=док.СуммаДок;
Расход=Сумма*1.18; //с учетом НДС
КонецЕсли;
КонецПроцедуры
Наконец,
нужно
написать
процедуру
ОбработкаПроведения(),
генерирующую соответствующие документу проводки.
Процедура ОбработкаПроведения()
Пока ПолучитьСтроку()=1 Цикл
Операция.НоваяПроводка();
Если Назначение=Перечисление.Назначение.ОплатаПоставки
Тогда
//генерируется проводка Д60(м.б. другой счет) - К51
Операция.Дебет.Счет=КоррСчет;
Операция.Кредит.Счет=СчетПоКоду("51");
Операция.Дебет.Контрагенты=Субконто;
Операция.Сумма=Расход;
Иначе
//генерируется проводка Д51 - К62 (м.б. другой счет)
Операция.Дебет.Счет=СчетПоКоду("51");
Операция.Кредит.Счет=КоррСчет;
Операция.Кредит.Контрагенты=Субконто;
Операция.Сумма=Приход;
КонецЕсли;
КонецЦикла;
Операция.Записать();
КонецПроцедуры
77
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Ведение оперативного учета
Обработка проведения документа предназначена для ведения не только
бухгалтерского, но и оперативного учета. Оперативный учет подразумевает
классификацию средств не по бухгалтерским счетам, а по так называемым
регистрам.
Регистры являются одним из основных элементов конфигурации.
Можно создавать два вида регистров – регистры остатков и регистры
оборотов. Регистр остатков работает по принципу «приход – расход».
Главная его цель – отследить наличие и объем тех или иных средств на
конкретный момент времени. Регистр оборотов хранит информацию о
суммарных объемах всех операций заданного вида за временной период.
Регистр любого вида имеет измерения, ресурсы и реквизиты.
Измерениями называют объекты, в разрезе которых происходит хранение
информации об остатках или оборотах. Ресурсами являются данные
числового типа, которые предназначены для хранения остатков или
оборотов. Реквизиты же хранят вспомогательную информацию об одной
записи регистра, которую называют движением.
Пусть требуется создать регистр, который хранит остатки материалов
различных видов на складе. Тогда измерением регистра является вид
материала, т.е. объект типа Справочник.Материалы, ресурсами регистра
могут являться количество и стоимость материала. В качестве реквизитов
можно использовать, к примеру, тип документа, по которому произошел
приход или расход материалов, ссылку на поставщика, от которого
поступили материалы, и прочие.
Операции с регистрами выполняются в документах. Для того чтобы
документ
мог
работать
с
регистрами,
требуется
отметить
Оперативный учет на диалоге редактирования свойств документа.
78
флажок
Программирование в среде 1С:Предприятие
Создание одного движения регистра представляет собой заполнение
всех измерений, ресурсов и реквизитов регистра. Для регистра остатков это
означает приход или расход объекта измерения на размер ресурсов. Для
регистра
оборотов
движение
означает
только
увеличение
оборота
конкретного периода по конкретному объекту измерения в объеме ресурсов.
Создание
движений
регистров
производится
в
процедуре
ОбработкаПроведения() документа.
В системе 1С:Предприятие существует глобальный системный объект
Регистр. Через него можно получить доступ ко всем регистрам, созданным в
конфигурации, как к его атрибутам. После заполнения данных движения
регистра (измерений, ресурсов, реквизитов) следует вызвать процедуру
ДвижениеПриходВыполнить() или ДвижениеРасходВыполнить() для
регистра остатков, или ДвижениеВыполнить() для регистра оборотов.
Просмотр
движений
регистров,
соответствующих
конкретному
документу, можно осуществить через вызов контекстного меню документа
(пункт Движения документа). Пиктограмма рядом со строкой движения
говорит о том, является ли движение приходом (+) или расходом (-).
Получить остатки или обороты регистра можно с помощью функций
Остаток(Измерение1, Измерение2…, ИмяРесурса) для регистра остатков и
Итог(Измерение1, Измерение2…, ИмяРесурса) для регистра оборотов. В
обоих случаях первыми параметрами задаются объекты измерений регистра.
В
качестве
последнего
параметра
указывается
символьная
строка,
содержащая идентификатор ресурса, остаток или итог по которому нужно
получить.
Разберем простой пример, показывающий как работать с регистрами
оперативного учета. Создадим в конфигурации два регистра:
1.
регистр МатериалыНаСкладе, хранящий остатки всех видов
материалов на складе. Очевидно, это должен быть регистр остатков.
Измерением
в
нем
будет
являться
объект
Материал
Справочник.Материалы, ресурсами – Количество и Стоимость;
79
типа
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
регистр Поставки, в котором хранятся обороты по поставкам
2.
материалов разными поставщиками за месяц. Это уже регистр оборотов, в
котором
в
качестве
измерения
задан
объект
Поставщик
типа
Справочник.Контрагенты, а в качестве ресурсов – СуммаПоставок.
Создадим
два
документа
–
ПриходнаяНакладная
и
РасходнаяНакладная. Цель первого из них – зафиксировать приход
материалов на склад от поставщика, второго – расход материалов на
различные цели.
Реквизиты
документа
ПриходнаяНакладная
должны
быть
аналогичны реквизитам документа ПоступлениеМатериалов, создание
которого мы разбирали в предыдущих разделах: реквизит шапки Поставщик
(типа Справочник.Контрагенты), реквизиты табличной части – Материал
(типа Справочник.Материалы), Количество (типа Число), ЦенаЕдиницы
(типа Число), СтоимостьПартии (типа Число). В свойствах реквизита
СтоимостьПартии нужно отметить флажок Итог по колонке, который
позволит использовать функцию
стоимости
всех
материалов
Итог(ИмяКолонки) для
по
приходной
получения
накладной.
Документ
РасходнаяНакладная должен иметь точно такую же табличную часть.
Сначала рассмотрим создание документа ПриходнаяНакладная. При
проведении данного документа требуется оформить движения по обоим
регистрам
–
каждой
соответствовать
конкретного
строке
движение
материала
табличной
регистра
на
склад),
части
документа
МатериалыНаСкладе
стоимость
всех
должно
(приход
материалов,
оприходованных по документу, должна быть отражена в регистре Поставки.
Таким
образом,
процедура
ОбработкаПроведения()
ПриходнаяНакладная имеет следующий вид.
Процедура ОбработкаПроведения()
// перебор строк табличной части документа
ВыбратьСтроки();
80
документа
Программирование в среде 1С:Предприятие
Пока ПолучитьСтроку()=1 Цикл
// создаем движение регистра МатериалыНаСкладе
// по приходу материалов на склад
// задаем атрибуты регистра
Регистр.МатериалыНаСкладе.Материал=Материал;
Регистр.МатериалыНаСкладе.Количество=Количество;
Регистр.МатериалыНаСкладе.Стоимость=СтоимостьПартии;
// записываем движение в регистр МатериалыНаСкладе
Регистр.МатериалыНаСкладе.ДвижениеПриходВыполнить();
КонецЦикла;
// создаем движение регистра Поставки
Регистр.Поставки.Поставщик=Поставщик;
Регистр.Поставки.СуммаПоставок=Итог("СтоимостьПартии");
Регистр.Поставки.ДвижениеВыполнить();
КонецПроцедуры
Проиллюстрируем получение итогов по регистру оборотов на
следующем примере. При работе с документами типа ПриходнаяНакладная
может оказаться необходимым посмотреть общую информацию о поставках
выбранного поставщика. Например, это можно сделать в обработчике
нажатия кнопки Обороты поставщика на форме документа.
Процедура СообщитьОбороты()
// задаем период расчета оборотов – год и месяц
Регистр.Поставки.ИспользоватьПериод(ДатаГод(ДатаДок),
ДатаМесяц(ДатаДок));
Если Поставщик.Выбран()=1 Тогда
// получаем итог
ОборотПоставщика=Регистр.Поставки.Итог(Поставщик,
"СуммаПоставок");
Сообщить("На "+ДатаДок+" поставщик"+
Поставщик.Наименование+" имеет оборот "+
ОборотПоставщика+" рублей");
КонецЕсли;
КонецПроцедуры
81
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
При разработке документа РасходнаяНакладная требуется ответить
на следующие вопросы. Во-первых, по какой стоимости отпускать со склада
материалы. Примем для этого стратегию средней фактической стоимости,
т.е. стоимость единицы принимается как средняя стоимость всех хранящихся
материалов
данного
вида.
Во-вторых,
нельзя
отпустить
количество
материала большее, чем есть на складе. В этом случае требуется
информировать пользователя и скорректировать введенное им количество
(например, установить реальное количество находящихся на складе
материалов этого вида).
Для решения первого вопроса напишем пользовательскую процедуру
ОпределениеСуммы(). Вызываться процедура должна в момент, когда
определяется материал, который требуется расходовать.
Процедура ОпределениеСуммы()
КолМатериала=Регистр.МатериалыНаСкладе.Остаток(Материал,
"Количество");
СтоимМатериала=Регистр.МатериалыНаСкладе.Остаток
(Материал, "Стоимость");
Если КолМатериала=0 Тогда
ЦенаЕдиницы=0;
Иначе
ЦенаЕдиницы=СтоимМатериала/КолМатериала;
КонецЕсли;
КонецПроцедуры
Для решения второй проблемы создадим пользовательскую процедуру
ПроверкаКоличества(). Вызов этой процедуры требуется в моменты, когда
выбирается материал или вводится его количество в табличную часть
документа.
Процедура ПроверкаКоличества()
// если в строке был выбран материал
Если Материал.Выбран()=1 Тогда
82
Программирование в среде 1С:Предприятие
КолМатериала=Регистр.МатериалыНаСкладе.Остаток
(Материал, "Количество");
// если остаток материала меньше
// требуемого количества
Если Количество>КолМатериала Тогда
Сообщить("Остаток материала "+
Материал.Наименование+" составляет "+
КолМатериала);
// устанавливаем количество,
// равное остатку материала
Количество=КолМатериала;
КонецЕсли;
// осуществляем пересчет стоимости расходуемой партии
СтоимостьПартии=ЦенаЕдиницы*Количество;
КонецЕсли;
КонецПроцедуры
Наконец,
процедура
ОбработкаПроведения()
документа
РасходнаяНакладная должна иметь следующий вид.
Процедура ОбработкаПроведения()
// перебор строк табличной части документа
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
// создаем движение регистра МатериалыНаСкладе
// по расходу материалов со склада
Регистр.МатериалыНаСкладе.Материал=Материал;
Регистр.МатериалыНаСкладе.Количество=Количество;
Регистр.МатериалыНаСкладе.Стоимость=СтоимостьПартии;
// записываем движение в регистр МатериалыНаСкладе
Регистр.МатериалыНаСкладе.ДвижениеРасходВыполнить();
КонецЦикла;
КонецПроцедуры
83
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Глава 5. Разработка печатных форм и отчетов
Основные понятия
Отчеты являются одним из основных элементов конфигурации
системы 1С:Предприятие. Они предназначены для того, чтобы получать
сводную информацию о данных, хранящихся в системе. Проектирование
отчета зачастую связано с созданием печатной формы, шаблон которой
задается на вкладке Таблица. Заметим, что печатная форма может быть
создана не только в отчетах, но и в справочниках, документах и прочих
элементах конфигурации.
Отчет, как и другие элементы конфигурации, может иметь форму, на
которой задаются некоторые исходные данные для формирования отчета.
Например, если формируется отчет о заработной плате конкретного
сотрудника, то на форме отчета может быть помещен элемент управления,
позволяющий выбрать сотрудника, для которого требуется получить данные.
Работа с отчетом обычно производится так. Сначала на экране
появляется форма отчета, которая позволяет ввести некоторые исходные
данные. Согласно стандартному подходу на форме должна находиться
кнопка
Сформировать,
нажатие
которой
вызывает
процедуру
Сформировать(). В данной процедуре создается объект агрегатного типа
данных Таблица, который связывается с шаблоном, спроектированным на
вкладке Таблица (кстати, название вкладки можно поменять). Содержимое
вкладки Таблица похоже на лист в редакторе электронных таблиц MS Excel.
Шаблон состоит из нескольких видов секций, представляющих собой набор
ячеек с текстом и переменными. После привязки шаблона к объекту типа
Таблица в него в необходимой последовательности осуществляется вывод
секций. Наконец, когда все данные в область вывода помещены,
сформированный отчет нужно показать на экране.
Опишем создание структуры шаблона табличной формы.
84
Программирование в среде 1С:Предприятие
Чтобы поместить ячейки в ту или иную секцию, нужно выделить эти
ячейки и с помощью меню Таблица – Включить в секцию включить ячейки
в секцию с заданным именем. Секции могут быть горизонтальными или
вертикальными.
Секции
можно
именовать
произвольным
образом.
Например, если требуется создать отчет с информацией по основному
средству, можно ввести горизонтальные секции – Заголовок, Стоимость,
СрокИспользования, МатОтвЛицо.
Далее требуется указать содержимое конкретных ячеек. Для этого
нужно выбрать ячейку, вызвать контекстное меню, выбрать пункт Свойства.
Здесь можно задавать стилевые характеристики выводимого текста (вкладки
Шрифт, Рамка), но главным образом интерес представляет вкладка Текст.
Поле Тип на ней может иметь следующие значения:

текст, например, Оборотно-сальдовая ведомость;

выражение (вычисляемое выражение, возможно, с использованием
переменных модуля), например, “Отчет на “+ТекущаяДата();

шаблон
(выражение,
перемешивающее
текст
и
значения
переменных, отделение переменных от текста осуществляется с помощью
символов квадратных скобок), например, Отчет на [ТекущаяДата()].
При использовании выражения или шаблона система сама помещает
значения для вывода при проектировании в угловые скобки (<>). Например, с
помощью
только
лишь
шаблонов можно
спроектировать
структуру
инвентарной карточки основного средства (рис. 5.1).
Теперь можно инициировать вывод информации. Первый шаг для
этого – создание объекта агрегатного типа Таблица:
Таб=СоздатьОбъект("Таблица");
85
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Рис.5.1.Шаблон для печатной формы
«Инвентарная карточка основного средства»
Далее необходимо выбрать шаблон печатной формы, с помощью
которого осуществляется вывод (у любого отчета, документа и других
элементов конфигурации может быть несколько печатных форм).
Таб.ИсходнаяТаблица("Таблица");
В качестве параметра этот метод принимает имя шаблона печатной
формы. Далее следует вывести в необходимой последовательности нужные
секции. Например, вывод секций печатной формы «Инвентарная карточка
основного средства» может быть таким:
Таб.ВывестиСекцию("Заголовок");
Таб.ВывестиСекцию("Стоимость");
Таб.ВывестиСекцию("СрокИспользования");
Таб.ВывестиСекцию("МатОтвЛицо");
После вывода всей информации требуется указать режим просмотра
таблицы (можно ее редактировать или нет). Эту функцию выполняет метод
86
Программирование в среде 1С:Предприятие
Таб.ТолькоПросмотр(1);
//редактировать нельзя
И, наконец, нужно показать таблицу на экран:
Таб.Показать();
Естественно, последовательность вывода различных секций и их
количества зависит от специфики задачи. Например, если рассматривается
отчет Оборотно-сальдовая ведомость, то результат мог бы быть таким
(рис.5.2):
Рис.5.2. Отчет «Оборотно - сальдовая ведомость»
При проектировании данного отчета шаблон печатной формы содержал
секции под заголовок отчета, шапку таблицы и по одной секции для вывода
информации о счете, о субконто и об итоговой информации по колонкам.
Шаблон
будет
выглядеть
так,
как
показано
на
рис.5.3.
Секции,
соответствующие счетам плана счетов и субконто, выводятся столько раз и в
87
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
таком порядке, в каком счета представлены в плане счетов, а элементы
субконто – в прикрепленных к счетам справочниках, т.е. все зависит от
алгоритма просмотра – формируются значения переменных, а затем
выводятся в печатную форму посредством соответствующей секции.
Рис.5.3. Шаблон печатной формы для отчета
«Оборотно – сальдовая ведомость»
Пример – отчет «Журнал документов»
Создадим простой отчет, позволяющий распечатать информацию обо
всех документах и соответствующих им проводках за конкретный период
времени. Фактически, вся задача здесь сводится к перебору всех документов:
1.
создание объекта типа Документ, например, док;
2.
выбор документов из диапазона дат с применением процедуры
объекта типа Документ док.ВыбратьДокументы(ДатаНач, ДатаКон)
(ДатаНач и ДатаКон – идентификаторы двух полей на форме отчета,
обозначающих период журнала документов);
3.
цикл пока по условию док.ПолучитьДокумент()=1.
Внутри цикла можно получить доступ к объекту Операция,
прикрепленному к документу (он доступен только при включенной опции
Бухгалтерский учет у этого документа). Напомним, что операция может
88
Программирование в среде 1С:Предприятие
состоять из нескольких проводок. Поэтому далее требуется запустить цикл
перебора проводок. Для этого сначала нужно выбрать все проводки операции
документа (док.Операция.ВыбратьПроводки()), а затем осуществить
перебор проводок с помощью метода док.Операция.ПолучитьПроводку().
На каждой итерации этого цикла объект Операция будет позиционирован на
конкретной проводке, и можно получить информацию о ней для вывода в
таблицу: Операция.Дебет.Счет, Операция.Кредит.Счет, Операция.Сумма
и т.д. Отдельно следует заметить, что функция Субконто() объекта Счет,
которую мы применяли для установки значения субконто в проводке, может
использоваться и для получения текущего значения субконто. Для этого
требуется указать только первый параметр функции – уровень субконто.
Рис.5.4. Отчет «Журнал документов»
Результат формирования отчета по журналу документов изображен на
рис. 5.4. Шаблон печатной формы для вывода отчета приведен на рис. 5.5.
Здесь д и к – переменные, хранящие коды счетов по дебету и кредиту в
проводке; субконто1 и субконто2 – переменные для хранения объектов
аналитического учета по дебету и кредиту, соответственно; сум и кол –
сумма и количество по проводке.
89
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Рис.5.5. Шаблон вывода для отчета «Журнал документов»
Код процедуры Сформировать() для этого отчета приведен ниже.
Процедура Сформировать()
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Заголовок");
док=СоздатьОбъект("Документ");
док.ВыбратьДокументы(ДатаНач, ДатаКон);
Пока док.ПолучитьДокумент()=1 Цикл
Таб.ВывестиСекцию("Документ");
док.Операция.ВыбратьПроводки();
Пока док.Операция.ПолучитьПроводку()=1 Цикл
д=док.Операция.Дебет.Счет.Код;
к=док.Операция.Кредит.Счет.Код;
Если док.Операция.Дебет.Счет.КоличествоСубконто()>0
Тогда
// получаем субконто первого уровня
субконто1=док.Операция.Дебет.Субконто(1);
Иначе
субконто1="";
КонецЕсли;
Если док.Операция.Кредит.Счет.КоличествоСубконто()>0
Тогда
субконто2=док.Операция.Кредит.Субконто(1);
Иначе
субконто2="";
КонецЕсли;
// если хотя бы по одному из счетов ведется
// количественный учет, определяем количество
Если (док.Операция.Дебет.Счет.Количественный=1) или
(док.Операция.Кредит.Счет.Количественный=1)
90
Программирование в среде 1С:Предприятие
Тогда
кол="Количество - "+док.Операция.Количество;
Иначе
кол="";
КонецЕсли;
сум=док.Операция.Сумма;
Таб.ВывестиСекцию("проводка");
КонецЦикла;
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать();
КонецПроцедуры
Заметим, что данную печатную форму и формирующую ее процедуру
можно помещать не только в отдельный отчет, но и непосредственно в
журнал документов.
Агрегатный тип данных «БухгалтерскиеИтоги»
С точки зрения бухгалтерии предприятия основным типом сводной
информации являются различного вида бухгалтерские итоги, включающие в
себя сальдо на начало и конец временного периода и обороты за период по
всем счетам плана счетов с учетом объектов аналитики (субконто). Для
получения таких данных во встроенном языке системы 1С:Предприятие
существует агрегатный тип данных БухгалтерскиеИтоги.
Итак, пусть создан объект этого типа:
БИ=СоздатьОбъект("БухгалтерскиеИтоги");
К этому объекту можно применить метод, который позволяет
рассчитать итоги за временной период:
91
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
БИ.Рассчитать(НачПериода, КонПериода);
Параметры НачПериода и КонПериода означают даты начала и
конца отчетного периода – периода расчета итогов. Расчет итогов также
можно произвести и через меню в режиме 1С:Предприятие (меню
Операции – пункт Управление бухгалтерскими итогами). После расчета
итогов можно получить значения сальдо и оборотов различных счетов плана
счетов с учетом объектов аналитики. Для этих целей предназначены
следующие методы агрегатного типа данных БухгалтерскиеИтоги:
// сальдо начальное дебетовое
СНД(Счет,ТипСуммы,Валюта,Субконто1,..)
// сальдо конечное дебетовое
СКД(Счет,ТипСуммы,Валюта,Субконто1,..)
// сальдо начальное кредитовое
СНК(Счет,ТипСуммы,Валюта,Субконто1,..)
// сальдо конечное кредитовое
СКК(Счет,ТипСуммы,Валюта,Субконто1,..)
// дебетовый оборот
ДО(Счет,ТипСуммы,Валюта,Субконто1,..)
// кредитовый оборот
КО(Счет,ТипСуммы,Валюта,Субконто1,..)
Первый параметр методов – счет, по которому должен быть получен
итог
(может
содержащей
иметь
тип
Счет.ОснПланСчетов
или
быть
строкой,
код счета). Второй параметр ТипСуммы равен "С", если
требуется вычислить сумму по счету, "К" – если требуется получить
количество по счету (применяется только к счетам, по которым ведется
количественный учет, например, к счету 10 – Материалы). Третий параметр
(необязательный) – валюта для счетов, по которым ведется валютный учет.
Наконец, далее идут значения субконто (объекты аналитики), по которым
требуется получить итоги. Все функции этой группы возвращают значения
92
Программирование в среде 1С:Предприятие
соответствующих итогов на тот период, для которого создан объект типа
БухгалтерскиеИтоги.
Есть еще один метод объекта БухгалтерскиеИтоги, возвращающий
некоторый итог:
БИ.ОБ(СчетД,СчетК,ТипСуммы,Валюта);
Этот метод возвращает обороты между счетами, т.е. оборот по всем
проводкам, в которых по дебету участвует счет, указанный в параметре
СчетД, а по кредиту – счет из параметра СчетК.
Например, пусть требуется для счета 60 получить на конкретную дату
(ДатаКон) все наши задолженности в разрезе поставщиков. Эту задачу
поможет решить следующий код.
Спр=СоздатьОбъект("Справочник.Контрагенты");
БИ=СоздатьОбъект("БухгалтерскиеИтоги");
БИ.Рассчитать(ДатаКон, ДатаКон);
//перебираем элементы справочника Контрагенты
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
//группы элементов не обрабатываем
Если Спр.ЭтоГруппа()=0 Тогда
// вывод информации о конечном кредитовом сальдо в
// рублях по конкретному поставщику
Предупреждение(Спр.ТекущийЭлемент().Наименование+
"-"+
БИ.СКК("10","С",,Спр.ТекущийЭлемент())+"рублей");
КонецЕсли;
КонецЦикла;
93
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Создание диаграмм
Одним из наглядных способов представления сводной информации
является
построение
диаграмм.
В
системе
1С:Предприятие
такая
возможность имеется.
Диаграммы, которые можно построить в системе 1С:Предприятие, в
принципе, имеют тот же вид, что и диаграммы, к примеру, MS Excel. Данные
для построения диаграмм определяются в программных модулях.
Чтобы поместить диаграмму в какую-либо секцию печатной формы
отчета, нужно нажать на панели инструментов в нижней части окна кнопку
и выделить место на отчете, где должна располагаться диаграмма. В
результате получится шаблон, изображенный на рис.5.6.
Рис.5.6. Шаблон отчета с диаграммой
Дважды щелкнув мышью на диаграмме, можно вызвать диалоговое
окно свойств диаграммы, в котором настраиваются различные визуальные
свойства этого объекта. В частности, здесь выбирается тип диаграммы –
график, гистограмма, линейчатая, изометрическая, круговая и т.д.
Диаграмма рассматривается как рисунок. Вызов пользовательской
процедуры, которая будет заниматься построением диаграммы, требуется
94
Программирование в среде 1С:Предприятие
назначить на вкладке Текст пункта Свойства контекстного меню
диаграммы.
Назовем эту процедуру, например, ПостроитьДиаграмму().
При выводе секции, в которой находится диаграмма, сначала будет
вызываться эта пользовательская процедура, а затем рисоваться диаграмма.
Единственным параметром процедуры должна быть ссылка на диаграмму.
Напомним, что вывод на экран печатной формы производится с
помощью процедуры Сформировать(), в которой создается объект типа
Таблица. Диаграмма, располагаясь в секции шаблона печатной формы,
является одним из атрибутов этого объекта. Пусть, например, объект
Таблица был нами назван Таб. Тогда ссылку на диаграмму можно получить
с помощью атрибута Таб.ТекущийОбъект.
Таким образом, в поле на вкладке Текст диалога свойств диаграммы
указываем:
ПостроитьДиаграмму(Таб.ТекущийОбъект)
Итак, программный модуль нашего отчета должен содержать две
процедуры – Сформировать(), в которой создается объект таблицы,
выводятся секции и происходит вывод на экран, и ПостроитьДиаграмму(),
которая осуществляет весь процесс по получению данных и построению
диаграммы.
Тот объект, который процедура ПостроитьДиаграмму() получит в
качестве параметра, будет иметь агрегатный тип данных Диаграмма. Этот
агрегатный тип данных имеет ряд процедур и функций для установки данных
для диаграммы.
Каждая диаграмма имеет несколько серий. Обычно различные серии
данных отображаются различными цветами. Как правило, серия состоит из
нескольких точек. Таким образом, серии и точки задают двумерное
пространство аргумента данных диаграммы. В самом начале отображения
диаграммы требуется установить количество серий и количество точек. Для
95
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
таких целей предназначены методы КоличествоСерий(Количество) и
КоличествоТочек(Количество) агрегатного типа данных Диаграмма.
Серии
диаграммы
можно
именовать.
На
диаграмме
обычно
отображается легенда, указывающая, какой цвет соответствует какой серии.
Чтобы установить имя серии, нужно использовать следующий метод
УстановитьИмяСерии(НомерСерии, ИмяСерии) агрегатного типа данных
Диаграмма.
Данные для построения диаграммы устанавливаются с помощью
метода УстановитьЗначение(НомерТочки, НомерСерии, Значение).
Разберем
следующий
пример.
Создадим
отчет
с
диаграммой,
показывающей наличие различных видов материалов на складе на
конкретную дату, которая вводится с помощью элемента управления
ДатаОтчета на форме отчета.
Для данной диаграммы примем столько серий, сколько видов
материалов хранится в справочнике Материалы. Точка должна быть одна.
Она соответствует дате, на которую создается отчет.
При проектировании шаблона таблицы отчета введем только две
секции Заголовок и Диаграмма. Процедура Сформировать() будет
достаточно проста. Она просто создает объект агрегатного типа Таблица,
выводит две секции и показывает таблицу на экран.
Процедура Сформировать()
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Наличие материалов");
Таб.ВывестиСекцию("Заголовок");
Таб.ВывестиСекцию("Диаграмма");
Таб.ТолькоПросмотр(1);
Таб.Показать();
КонецПроцедуры
Код процедуры ПостроитьДиаграмму() будет при этом следующим:
96
Программирование в среде 1С:Предприятие
Процедура ПостроитьДиаграмму(Диагр)
КолСерий=0;
// количество серий определяется по количеству элементов
// в справочнике Материалы
Спр=СоздатьОбъект("Справочник.Материалы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
// группы элементов пропускаются
Если Спр.ЭтоГруппа()=0 Тогда
КолСерий=КолСерий+1;
КонецЕсли;
КонецЦикла;
// установка количества серий и точек
Диагр.КоличествоСерий(КолСерий);
Диагр.КоличествоТочек(1);
//в качестве значений на диаграмме примем количественное
// сальдо конечное по счету 10 и текущему
//элементу справочника
БИ=СоздатьОбъект("БухгалтерскиеИтоги");
БИ.Рассчитать(ДатаОтчета, ДатаОтчета);
номер=1;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=0 Тогда
Диагр.УстановитьИмяСерии(Номер,
Спр.Наименование);
Диагр.УстановитьЗначение(1,номер,
БИ.СКД("10","К",,Спр.ТекущийЭлемент()));
номер=номер+1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Создание отчетов с помощью запросов
Информацию для создания какого-либо отчета чаще всего приходится
искать в документах. Данные из документов определенным образом
агрегируются и группируются. Так получаются данные для окончательного
97
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
отчета. Одним из инструментов быстрого получения информации из
документов среды 1С:Предприятие является построение запросов.
В системе 1С:Предприятие существует специальный агрегатный тип
данных – Запрос. Запросы формулируются на специальном языке запросов.
В тексте запроса присутствуют следующие секции:

объявление переменных запроса (ссылки на атрибуты или
реквизиты объектов), например,
Количество = Документ.ПоступлениеМатериалов.Количество
или
Поставщик = Документ.ПоступлениеМатериалов.Поставщик

описание
функций
агрегирования,
значения
которых
определяются на основании переменных запроса, например,
Функция Сумма1 = Сумма(Количество)

описание
группировок
запроса
(по
каким
переменным
необходимо сгруппировать данные и как их упорядочить), например,
Группировка Поставщик упорядочить по Поставщик.Наименование
Текст запроса удобно сохранить в строковой переменной. После
формирования текста запроса следует его выполнить. Для этого требуется
создать объект агрегатного типа данных Запрос (например, МойЗапрос) и
вызвать для него метод Выполнить(ТекстЗапроса). Эта функция вернет 0,
если в запросе была ошибка, в противном случае будет возвращена 1.
Далее требуется осуществить перебор строк полученной выборки.
Перебор осуществляется с помощью функции Группировка(), параметром
которой является НомерГруппировки или ИмяГруппировки, заданное при
формулировке запроса. Функция Группировка() возвращает 1, если
получена новая строка с данными следующей группы. Получить значение по
этой
группе
можно
с
помощью
метода
ЗначениеУпорядочивания
(Группировка, Упорядочивание) типа данных Запрос. Первый параметр
функции задает номер используемой группировки или его имя, а второй
параметр – номер или имя признака сортировки, заданного в описании этой
группировки (сортировка может производиться, к примеру, по нескольким
98
Программирование в среде 1С:Предприятие
реквизитам объекта, который является основанием группировки). Можно
напрямую обращаться к переменной запроса, например, Запрос.Поставщик.
При
обработке
агрегирования
следует
результатов
запроса
обращаться
без
к
указания
значениям
скобок.
функций
Например,
Запрос.Функция1.
Полезной также является процедура, которая позволяет выгружать
результат выполнения запроса в таблицу значений и затем анализировать эти
данные
с
помощью
возможностей
агрегатного
типа
данных
ТаблицаЗначений:
Таб=СоздатьОбъект("ТаблицаЗначений");
Запрос=СоздатьОбъект("Запрос");
// формирование текста запроса и его выполнение
Запрос.Выгрузить(Таб);
Для создания запросов в отчете или другом элементе конфигурации
можно воспользоваться конструктором запросов. Например, откроем форму
некоторого отчета, выбираем меню Конструкторы – Запрос. Нам будут
предложены диалоги, в которых последовательно можно будет задать, будет
ли запрос иметь период, задать имена переменных, функций агрегирования,
поля группировки. В последнем диалоге нужно проследить, чтобы были
выбраны флажки Генерировать процедуру и Генерировать таблицу.
Таким образом, будет сгенерирована не только процедура обработки запроса,
но и все секции таблицы вывода информации для этого отчета. Далее
сгенерированную таблицу и процедуру можно редактировать произвольным
образом.
Рассмотрим пример создания отчета с помощью запроса. Данный отчет
должен отражать информацию о поставках различными поставщиками
различных материалов.
Текст запроса формулируется так:
99
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
ТекстЗапроса ="//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Поставщик = Документ.ПоступлениеМатериалов.Поставщик;
|Материал = Документ.ПоступлениеМатериалов.Материал;
|Количество = Документ.ПоступлениеМатериалов.Количество;
|Сумма = Документ.ПоступлениеМатериалов.Сумма;
|Функция Сумма1 = Сумма(Количество);
|Функция Сумма2 = Сумма(Сумма);
|Группировка Поставщик
упорядочить по Поставщик.Наименование;
|Группировка Материал
упорядочить по Материал.Наименование;
|";//}}ЗАПРОС
Данный запрос формируется за период с ВыбНачПериода до
ВыбКонПериода, которые вводятся в диалоге отчета в виде полей
редактирования типа Дата. В качестве переменных выбираются Поставщик
(реквизит документа
табличной
части
ПоступлениеМатериалов), Материал
документа
ПоступлениеМатериалов),
(реквизит
Количество
(реквизит табличной части документа ПоступлениеМатериалов), Сумма
(реквизит табличной части документа ПоступлениеМатериалов). В качестве
функций агрегирования приводятся информация об общей сумме поставок
конкретного поставщика. Первый уровень группировки задается по
поставщику. Внутри каждой такой группы группировка осуществляется по
материалу.
Цикл перебора строк полученной выборки будет выглядеть так:
// получение следующей строки с группировкой по поставщику
Пока Запрос.Группировка(1) = 1 Цикл
// Вывод секции с информацией о поставщике
// получение строк по группировке материалов для
// текущего поставщика
100
Программирование в среде 1С:Предприятие
Пока Запрос.Группировка(2) = 1 Цикл
//Вывод секции о материале
КонецЦикла;
КонецЦикла;
Таким образом, вся процедура Сформировать() имеет следующий вид:
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
ТекстЗапроса ="//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Поставщик = Документ.ПоступлениеМатериалов.Поставщик;
|Материал = Документ.ПоступлениеМатериалов.Материал;
|Количество = Документ.ПоступлениеМатериалов.Количество;
|Сумма = Документ.ПоступлениеМатериалов.Сумма;
|Функция Сумма1 = Сумма(Количество);
|Функция Сумма2 = Сумма(Сумма);
|Группировка Поставщик
упорядочить по Поставщик.Наименование;
|Группировка Материал
упорядочить по Материал.Наименование;
|";//}}ЗАПРОС
Запрос=СоздатьОбъект("Запрос");
// если запрос не выполнится, например,
// из-за ошибки в запросе
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Заголовок");
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("поставщик");
Пока Запрос.Группировка(2) = 1 Цикл
Таб.ВывестиСекцию("материал");
КонецЦикла;
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.Показать();
КонецПроцедуры
101
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Глава 6. Экспорт и импорт данных в системе
1С:Предприятие
Работа с файловой системой
Экспорт и импорт данных из системы в систему осуществляется чаще
всего путем сохранения данных в файлах стандартных форматов. К таким
форматам относятся формат текстовых файлов, формат DBF для сохранения
табличных данных, а также формат XML.
В любом случае требуется осуществлять работу с файловой системой –
искать файлы, выбирать их, двигаться по системе каталогов на диске и
решать прочие задачи работы с файлами. Для этих целей предназначен
глобальный системный объект, существующий в любой конфигурации
системы 1С:Предприятие – объект ФС (объект файловой системы).
Заметим, что существование объекта ФС не исключает создание любого
количества объектов этого типа.
Агрегатный тип данных ФС имеет следующие функции, позволяющие
решать задачи поиска, создания, удаления файлов и каталогов.

ТекущийКаталог() – возвращает строку с именем текущего
каталога.

УстТекКаталог(ИмяКаталога)
–
устанавливает
указанный
каталог в качестве текущего.

СоздатьКаталог(ИмяКаталога) – создает новый каталог.

УдалитьКаталог(ИмяКаталога) – удаляет указанный каталог.

СвободноеМестоНаДиске(ИмяДиска) –
возвращает размер
свободного места на указанном диске.

ВыбратьФайл(ТипДиалога,
ИмяФайла,
ИмяНачКаталога,
ЗаголовокОкна, Фильтр, Расширение) – выводит на экран диалог
выбора/сохранения файла. Эта функция возвращает 0, если будет нажата
кнопка Отмена, 1 – если нажата кнопка ОК. Первый параметр равен 0, если
102
Программирование в среде 1С:Предприятие
требуется открыть файл, 1 – если требуется сохранить файл. Второй
параметр содержит имя выбранного файла. Третий параметр – имя
начального каталога. Параметр Фильтр содержит фильтр отбора файлов
(например: 'Все файлы (*.*) |*.*'). Последний параметр представляет собой
строку с расширением по умолчанию.

СуществуетФайл(ИмяФайла) – возвращает 1, если файл
существует, 0 – в противном случае.

КопироватьФайл(ИмяИсточника,
ИмяПриемника,
ФлагПерезаписи) – позволяет копировать файл источника в файл
приемника. Последний параметр равен 0, если требуется перезаписать
существующий файл, и 1 – если уже существующий файл не требуется
переписывать.

ПереименоватьФайл(ИмяИсточника,
ИмяПриемника,
ФлагПерезаписи) – позволяет переместить/переименовать файл источника в
файл приемника. Последний параметр равен 1, если существующий файл
требуется перезаписать, 0 – в противном случае.
Экспорт и импорт данных с помощью текстовых файлов
Текстовые файлы являются одним из основных способов экспорта и
импорта данных. Достаточно часто их используют для сохранения
сформированных системой документов, например, с целью последующей
печати.
Для работы с текстовыми файлами в системе 1С:Предприятие
используется агрегатный тип данных Текст. Средствами этого объекта
можно не только выводить сформированные строки в текстовые файлы, но и
считывать данные из уже существующих файлов с последующим разбором
их по строкам.
Агрегатный тип данных Текст имеет следующие методы для работы с
текстовыми файлами. Для чтения данных из текстового файла требуется
103
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
предварительно
его
открыть.
Для
этого
предназначен
метод
ОткрытьФайл(ПутьКФайлу) агрегатного типа данных Текст. После
открытия файла объект типа данных Текст будет связан с этим файлом.
Можно очистить содержимое текстового файла. Это делается с
помощью метода Очистить().
Получить количество строк в текстовом файле можно с помощью
метода КоличествоСтрок(). Используя номер строки, можно прочитать,
удалить, вставить, заменить строку. Также можно добавить строку в конец
текстового файла. Это делают следующие методы агрегатного типа данных
Текст:
ПолучитьСтроку(НомерСтроки)
УдалитьСтроку(НомерСтроки)
ВставитьСтроку(НомерСтроки, Строка)
ЗаменитьСтроку(НомерСтроки, Строка)
ДобавитьСтроку(Строка)
При работе с текстовыми файлами так же, как и при создании печатных
форм, можно использовать режим шаблона. Этот режим позволяет
смешивать текст и значения переменных. Для использования шаблонов при
записи текстового файла требуется включить режим использования
шаблонов с помощью метода Шаблон(Флаг) агрегатного типа данных Текст
с параметром, равным 1. Если параметр равен 0, то использовать шаблоны
при работе с этим текстовым файлом запрещается.
Для сохранения файла на диск требуется использовать метод
Записать(ИмяФайла) агрегатного типа данных Текст. Заметим, что для
записи можно использовать имя файла, отличное от того имени, которое
указывалось в методе Открыть().
Можно также просмотреть содержимое файла с помощью процедуры
Показать().
104
Программирование в среде 1С:Предприятие
Рассмотрим теперь несколько примеров использования текстовых
файлов.
Первый пример заключается в печати документа в текстовый файл.
Продолжим разрабатывать, к примеру, документ ПоступлениеМатериалов.
На форме этого документа существовала кнопка Печать документа, нажатие
которой приводило к формированию печатной формы. Средствами системы
1С:Предприятие ее сразу можно выводить на принтер. Однако иногда
требуется перенести эту информацию на другой компьютер. Это удобно
сделать с помощью экспорта в текстовый файл.
Для этого на форму документа установим еще одну кнопку Сохранить,
нажатие
на
которую
будет
вызывать
пользовательскую
процедуру
Сохранить(). В указанной процедуре должен быть инициирован выбор
файла, в который производится сохранение данных, и произведена запись в
этот файл.
Процедура Сохранить()
Перем ИмяФайла;
Т=СоздатьОбъект("Текст");
//инициируем вывод диалога выбора файла для записи.
//Начальным должен быть текущий каталог
Если ФС.ВыбратьФайл(0,ИмяФайла, ФС.ТекКаталог(),
"Выберите файл для записи","*.txt","txt")=1 Тогда
Т.Шаблон(1); //разрешаем использовать шаблоны
// строки текста соответствуют секциям
// печатной формы
Стр="Накладная на поступление материалов "+
"№ [НомерДок] от [ДатаДок]";
Т.ДобавитьСтроку(Стр);
Стр="Поставщик: [Поставщик.Наименование]";
Т.ДобавитьСтроку(Стр);
// перебираем строки табличной части документа
Для Инд=1 по КоличествоСтрок() Цикл
ПолучитьСтрокуПоНомеру(Инд);
Стр="[Материал] в количестве [Количество] "+
"[Материал.ЕдИзмерения] по цене [Цена] руб. "+
"Итого сумма: [Сумма] руб.";
105
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Т.ДобавитьСтроку(Стр);
КонецЦикла;
// запись файла (нужно указать также
// выбранный каталог)
Т.Записать(ФС.ТекКаталог()+"\"+ИмяФайла);
Т.ТолькоПросмотр(1);
Т.Показать(); //показать содержимое файла
КонецЕсли;
КонецПроцедуры
Второй пример касается чтения данных из текстового файла. Пусть по
итогам какой-либо работы руководство принимает решение о начислении
премий ряду сотрудников. Напомним, что при этом должна оформляться
проводка Д 20 – К 70. Пусть конфигурация содержит справочник
Сотрудники и соответствующий ему вид субконто Сотрудники, который
прикреплен, в частности, к счету 70. Из администрации предприятия
поступает текстовый файл, каждая строка которого содержит ФИО
сотрудника (фамилия и инициалы хранятся в реквизите Наименование
справочника Сотрудники) и размер начисляемой премии.
Итак,
документ
НачислениеПремий
должен
иметь
реквизиты
табличной части Сотрудник типа Справочник.Сотрудники и Премия типа
Число. На форме документа поместим кнопку Выбрать, которая инициирует
выбор файла. После выбора файла табличная часть документа должна быть
заполнена данными, считанными из выбранного файла. Эту работу должна
проделать пользовательская процедура Выбор(), которая вызывается при
нажатии кнопки Выбрать.
Процедура Выбор()
Перем ИмяФайла;
Т=СоздатьОбъект("Текст");
Спр=СоздатьОбъект("Справочник.Сотрудники");
Если ФС.ВыбратьФайл(0,ИмяФайла,ФС.ТекКаталог(),
"Выберите файл","*.txt","txt")=1 Тогда
106
Программирование в среде 1С:Предприятие
//удалить строки табличной части, если таковые были
УдалитьСтроки();
Т.Открыть(ФС.ТекКаталог()+"\"+ИмяФайла);
Кол=Т.КоличествоСтрок();
//запускаем цикл по строкам файла
Для Инд=1 По Кол Цикл
//получаем строку по номеру
Стр=Т.ПолучитьСтроку(Инд);
//ищем позицию первого пробела.
// Добавляем 5 символов на инициалы сотрудника
Пробел=Найти(Стр," ")+5;
//выделяем фамилию и инициалы
ФИО=Лев(Стр,Пробел);
//выделяем размер премии
Стр=Прав(Стр, СтрДлина(Стр)-Пробел);
//находим элемент справочника
Если Спр.НайтиПоНаименованию(ФИО)=1 Тогда
// если такой элемент справочника существует,
// создаем новую строку табличной части
НоваяСтрока();
Сотрудник=Спр.ТекущийЭлемент();
Премия=Число(СокрЛ(Стр));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения() данного документа должна иметь
стандартный вид. Поэтому мы не будем приводить текст ее кода. В ней
производится проход по строкам табличной части документа. Для каждой
строки генерируется проводка Д 20 – К 70 с указанием в качестве субконто
по кредиту соответствующего сотрудника.
Экспорт и импорт данных с помощью файлов формата DBF
Еще одним стандартным форматом хранения данных является формат
DBF. Файлы формата DBF – это файлы таблиц. Для создания такого файла
107
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
требуется задать его структуру – список полей таблицы с указанием типов
данных и их длин. Затем можно заполнять файл данными.
Для работы с файлами формата DBF в системе 1С:Предприятие
существует специальный агрегатный тип данных XBase. Разберем основные
процедуры и функции, с которыми работает этот тип данных.
Для начала разберем последовательность действий при создании файла
формата DBF.
Сначала требуется создать объект агрегатного типа XBase, через
который будет осуществляться связь с файлом формата DBF, например,
ДБФ=СоздатьОбъект("XBase");
Далее требуется определить структуру файла, т.е. определить поля
таблицы. Объект агрегатного типа данных XBase для этих целей имеет
процедуру ДобавитьПоле (Название, Тип, Длина, Точность). Здесь
Название – наименование поля таблицы; Тип: "n" – числовой, "s" –
строковый, "d"– дата, "l"– логический; Длина – общая длина создаваемого
поля; Точность – количество знаков после десятичной точки (поле
обязательное, должно быть равно 0 для нечисловых типов данных).
После определения структуры таблицы можно создавать сам файл,
используя метод СоздатьФайл(ПутьКФайлу) агрегатного типа данных
XBase.
Теперь можно в созданный файл записывать информацию по
следующей схеме:

создать новую запись с помощью метода Добавить() агрегатного
типа данных XBase. Теперь текущей записью таблицы является новая запись
и обращение к объекту типа XBase (переменная ДБФ) – это обращение к
текущей записи в таблице.

Запись данных в строку таблицы, например,
108
Программирование в среде 1С:Предприятие
ДБФ.Name="Основные средства";
Все изменения объекта, сделанные таким образом, производятся в
оперативной памяти. При переходе к другой записи эти изменения будут
потеряны. Поэтому важным является следующий шаг.

Сохранение строки таблицы. Сохранение производится путем
вызова для объекта типа XBase (например, для переменной ДБФ) метода
Записать().

После записи всех данных в файл формата DBF этот файл
требуется закрыть. Для этого существует метод агрегатного типа данных
XBase, который применяется так:
ДБФ.ЗакрытьФайл();
Теперь рассмотрим последовательность действий при чтении данных
из файла формата DBF.
Для начала требуется открыть файл с информацией. Для этого
создается
объект
типа
XBase
и
для
него
вызывается
метод
ОткрытьФайл(ПутьКФайлу). Для перемещения по строкам DBF-таблицы
используются следующие методы:

ВНачале() – возвращает 1, если курсор находится в начале
таблицы, 0 – в противном случае;

ВКонце() – возвращает 1, если курсор находится в конце
таблицы, 0 – в противном случае;

Первая() – устанавливает курсор на первую строку таблицы;

Последняя() – устанавливает курсор на последнюю строку
таблицы;

Следующая() – для перехода на следующую строку таблицы;
109
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова

Предыдущая() – для перехода на предыдущую строку таблицы.
Очевидно, что в конце работы с файлом требуется файл закрыть.
В качестве примера использования файла формата DBF для экспорта и
импорта
данных
разберем
задачу
переноса
плана
счетов
между
конфигурациями.
Для создания нового плана счетов во вновь создаваемой конфигурации
можно, конечно, вручную создавать все счета. Однако такая работа является
достаточно
трудоемкой.
Другой
подход
к
созданию
плана
счетов
бухгалтерского учета заключается в переносе плана счетов из других
конфигураций, в частности, из типовой конфигурации, поставляемой вместе
с системой 1С:Предприятие. Суть такого переноса состоит в создании
внешнего файла формата DBF и переписывания в него всей информации о
плане счетов из типовой конфигурации, а затем использования этого
внешнего файла как источника информации для плана счетов новой
конфигурации.
Во-первых, создадим обработку внутри типовой конфигурации,
которая будет создавать файл формата DBF и записывать в него информацию
о счетах из основного плана счетов. Будет записываться вся информация,
кроме субконто, т.е. код, наименование, признаки количественного учета,
валютного учета, забалансовости и активности счета. Также будет
учитываться, имеет ли счет субсчета. На форме обработки поместим кнопку
Выполнить, на нажатие которой назначим вызов процедуры Выполнить().
Процедура Выполнить()
ДБФ=СоздатьОбъект("XBase");
ДБФ.ДобавитьПоле("Code", "S",6,0); //поле кода счета
ДБФ.ДобавитьПоле("Name", "S", 40,0); //поле имени счета
ДБФ.ДобавитьПоле("Val", "n",1,0); //1, если счет валютный
// количественный ли счет
ДБФ.ДобавитьПоле("Kol","n",1,0);
//забалансовый ли счет
110
Программирование в среде 1С:Предприятие
ДБФ.ДобавитьПоле("Zabal", "n",1,0);
//1 – активный, 2 - пассивный, 3 – активно-пассивный
ДБФ.ДобавитьПоле("AktPas", "n",1,0);
//1, если счет имеет субсчета, 0 - в противном случае
ДБФ.ДобавитьПоле("Gr", "n",1,0);
ДБФ.СоздатьФайл(ФС.ТекКаталог()+"\"+"plan.dbf");
//организуем перебор счетов из плана счетов Основной
Счет=СоздатьОбъект("Счет.Основной");
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
ДБФ.Добавить(); //добавляем новую строку
ДБФ.Code=Счет.Код;
ДБФ.Name=Счет.Наименование;
ДБФ.Val=Счет.Валютный;
ДБФ.Kol=Счет.Количественный;
ДБФ.Zabal=Счет.Забалансовый;
ДБФ.AktPas=Счет.Активный;
ДБФ.Gr=Счет.ЭтоГруппа();
ДБФ.Записать(); //фиксируем изменения
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецПроцедуры
Теперь рассмотрим, что требуется сделать в новой конфигурации,
чтобы принять информацию о счетах из файла формата DBF. Создаем план
счетов Основной. Создаем новую обработку. Также на кнопку Выполнить
назначаем вызов процедуры Выполнить(), код которой приводится ниже:
Процедура Выполнить()
ДБФ=СоздатьОбъект("XBase");
ДБФ.ОткрытьФайл(ФС.ТекКаталог()+"\"+"plan.dbf");
ДБФ.Первая(); //переход на первую запись таблицы
Счет=СоздатьОбъект("Счет.Основной");
// пока не достигнут конец таблицы, создаем новые счета
Пока ДБФ.ВКонце()=0 Цикл
Если ДБФ.Gr=1 Тогда //если счет имеет субсчета
Счет.Новый(1); //создаем как группу счетов
111
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Иначе
// создаем как независимый счет или
// субсчет какого-либо счета
Счет.Новый(0);
КонецЕсли;
// переписываем данные из таблицы DBF
Счет.Код=ДБФ.Code;
Счет.Наименование=ДБФ.Name;
Счет.Валютный=ДБФ.Val;
Счет.Забалансовый=ДБФ.Zabal;
Счет.Количественный=ДБФ.Kol;
Счет.Активный=ДБФ.AktPas;
Счет.Записать(); //фиксируем все изменения
//переход на следующую строку таблицы DBF
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецПроцедуры
Экспорт и импорт данных с помощью файлов формата XML
Расширяемый язык разметки XML (eXtensible Markup Language)
представляет собой современное средство для хранения и конвертирования
данных. В документе XML данные образуют древовидную структуру, что для
большинства
пользователей
является
наиболее
понятным
способом
организации данных. Для начала приведем краткое описание самых простых
правил языка XML.
Весь текст xml-документа можно грубо разделить на две категории –
символьные данные и тэги. Тэг представляет собой команду, которая
начинается с символа "<" и заканчивается символом ">". В отличие от
фиксированного набора тэгов языка HTML имена и структуру тэгов XML
разработчик xml-документа задает сам. Символьные данные – это те
структурированные данные, которые хранятся в документе.
112
Программирование в среде 1С:Предприятие
Xml-документ начинается со строки, самый простой вариант, которой
имеет следующий вид:
<? xml version="1.0" ?>
Эта строка называется определением xml. За ним следуют элементы,
которые представляют собой узлы древовидной структуры xml-документа. В
силу древовидности структуры xml-документ должен иметь единственный
корневой элемент, являющийся контейнером для всех остальных. Любой
элемент состоит из открывающего и закрывающего тэгов, например,
<book>...</book>. Имя элемента называют его общим идентификатором или
типом. Текст между открывающим и закрывающим тэгами называется
содержимым элемента. Например, в следующем фрагменте:
<book> О.В.Бартеньев. 1С:Предприятие.
Опыты программирования.</book>
book– это тип элемента, а строка "О.В.Бартеньев. 1С:Предприятие.
Опыты программирования." – его содержимое. Элемент, лишенный
содержимого, называется пустым элементом. Открывающий и закрывающий
тэги пустого элемента можно объединить в один тэг, поместив в его конец
косую черту <EmptyElement/>. В принципе, допускается запись пустого
элемента с помощью открывающего и закрывающего тэгов без содержимого
(<EmptyElement></EmptyElement>). Фактически оба способа имеют свое
применение,
поскольку
могут
быть
элементы,
которые
случайно
оказываются пустыми с точки зрения хранения пустого содержимого, а могут
существовать элементы, которые не имеют содержимого по определению.
У элементов могут быть атрибуты. Атрибут – это пара имя–значение,
расположенная в открывающем тэге элемента. Значения атрибутов должны
113
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
быть заключены в одинарные или двойные кавычки. Фактически в виде
атрибутов
часто
хранятся
значения
некоторых
свойств.
Например,
предыдущий пример с элементом, хранящим информацию о книге, можно
переформулировать так:
<book author="О.В.Бартеньев">
1С:Предприятие. Опыты программирования.</book>
Для работы с документами xml требуется наличие так называемого
парсера – специальной программы-анализатора, которая отслеживает
выполнение синтаксических правил языка. Браузер MS Internet Explorer
имеет встроенный парсер языка XML. Для работы с xml-документами в среде
1С:Предприятие используется внешняя компонента v7plus.dll. Таким
образом,
первый
шаг
при
работе
с
xml-документами
в
системе
1С:Предприятие состоит в том, что требуется загрузить эту внешнюю
компоненту. Следующий фрагмент кода позволяет осуществить эту загрузку
внешней компоненты, если она находится в каталоге информационной базы
для конфигурации.
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll")<>1
Тогда
Предупреждение("Компонента v7plus.dll не найдена!");
Возврат; //прервать выполнение процедуры
КонецЕсли;
Далее можно заняться работой с xml-документом. Создадим объект,
который представляет собой анализатор xml-документа.
Анализатор = СоздатьОбъект("AddIn.XMLParser");
114
Программирование в среде 1С:Предприятие
Разберем процесс работы по созданию нового xml-документа. С
помощью объекта-анализатора создадим пустой xml-документ.
xml=Анализатор.СоздатьДокумент();
Далее создаются все элементы документа с помощью функции
СоздатьПодчиненныйЭлемент(ИмяПодчЭлемента),
примененной
к
объекту родительского элемента для вновь создаваемого. В результате
работы будет возвращена ссылка на созданный элемент данных. Например,
создаем корневой элемент и подчиненный к нему.
Корень=xml.СоздатьПодчиненныйЭлемент("КорневойЭлемент");
Подчинен=Корень.СоздатьПодчиненныйЭлемент
("ПодчиненныйЭлемент");
В результате в xml-документ будут добавлены два элемента
КорневойЭлемент
и
ПодчиненныйЭлемент,
причем
второй
будет
подчинен первому.
Если элемент имеет атрибут, то его значение можно установить с
помощью
процедуры
УстановитьАтрибут
(НазваниеАтрибута,
ЗначениеАтрибута). Эту процедуру нужно вызвать для объекта, хранящего
ссылку на конкретный элемент xml-документа, указав в качестве первого
параметра символьную строку с названием атрибута и в качестве второго
параметра – его значение. Например, установим подчиненному элементу
атрибут имя со значением Подчиненный.
Подчинен.УстановитьАтрибут("имя","Подчиненный");
Установить содержимое элемента можно напрямую с помощью
атрибута Значение объекта, соответствующего этому элементу.
115
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Подчинен.Значение="Это текст внутри подчиненного элемента";
В результате будет создан xml-документ такого вида:
<? xml version="1.0" ?>
<КорневойЭлемент>
<ПодчиненныйЭлемент имя="Подчиненный">
Это текст внутри подчиненного элемента
</ПодчиненныйЭлемент>
</КорневойЭлемент>
Как и при работе с любыми другими форматами данных, сделанные
изменения требуется зафиксировать, т.е. записать в файл. Это делает
процедура Записать(ПутьКФайлу), которая вызывается для объекта
Анализатор, отвечающего за весь документ.
Теперь посмотрим, как производить чтение данных из xml-файла.
Загрузку внешней компоненты и создание объекта-парсера, естественно,
обязательно требуется провести и здесь. Далее также создается ссылка на
xml-документ с помощью функции СоздатьДокумент(). Далее следует
связать его с конкретным файлом с помощью метода Загрузить(ИмяФайла).
Доступ к отдельным узлам xml-документа осуществляется с помощью
функции
ВыбратьУзел(НазваниеУзла).
Функция
вернет
ссылку
на
требуемый узел xml-документа, если он один. Например,
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(Файл);
Корень=ФайлДанных.ВыбратьУзел("КорневойУзел");
Эта же функция применяется и к любому другому элементу xmlдокумента для получения доступа к его подчиненным элементам. Если
подчиненных элементов несколько, узнать их количество можно с помощью
116
Программирование в среде 1С:Предприятие
функции
КоличествоПодчиненных(),
примененной
к
объекту
родительского элемента. Далее каждый из подчиненных элементов можно
получить
с
помощью
функции
ПолучитьПодчиненныйПоНомеру
(НомерЭлемента). Для каждого элемента можно получить его атрибуты с
помощью
функции
ПолучитьАтрибут(НазваниеАтрибута),
а
также
содержимое элемента с помощью атрибута Значение объекта, содержащего
ссылку на элемент.
Разберем тот же пример, что и при использовании файла формата DBF
для
экспорта и
импорта данных.
Создадим обработку в
типовой
конфигурации для экспорта плана счетов. Структура xml-файла должна быть
такой. Корневой элемент xml-документа соответствует плану счетов в целом.
В нем располагаются подчиненные элементы с именем Счет, содержащие
информацию о счетах. В качестве содержимого элементов указывается
наименование счета. Остальные данные записываются в качестве атрибутов
(код, признаки валютного, количественного учета и пр.). В качестве
подчиненных
элементов
для
элемента
Счет
задаются
элементы,
обозначающие его субсчета с теми же атрибутами. Приведем код процедуры
экспорта плана счетов.
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+
"v7plus.dll")<>1 Тогда
Предупреждение("Компонента не обнаружена");
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Корень=Анализатор.СоздатьДокумент();
План=Корень.СоздатьПодчиненныйЭлемент("ПланСчетов");
Счет=СоздатьОбъект("Счет.Основной");
Родитель=СоздатьОбъект("Счет.Основной");
Счет.ВыбратьСчета();
Пока Счет.ПолучитьСчет()=1 Цикл
// если это счет, а не субсчет
117
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Если Счет.Уровень()=1 Тогда
Родитель.НайтиПоКоду(Счет.Код);
СчетXML=План.СоздатьПодчиненныйЭлемент("Счет");
СчетXML.УстановитьАтрибут("Код", Счет.Код);
СчетXML.УстановитьАтрибут("Валютный",
Счет.Валютный);
СчетXML.УстановитьАтрибут("Количественный",
Счет.Количественный);
СчетXML.УстановитьАтрибут("Забалансовый",
Счет.Забалансовый);
Если Счет.Активный=1 Тогда
СчетXML.УстановитьАтрибут("вид","активный");
ИначеЕсли Счет.Активный=2 Тогда
СчетXML.УстановитьАтрибут("вид","пассивный");
Иначе
СчетXML.УстановитьАтрибут("вид",
"активно-пассивный");
КонецЕсли;
СчетXML.Значение=Счет.Наименование;
Иначе
Если Счет.ПринадлежитГруппе(Родитель)=1 Тогда
СубсчетXML=СчетXML.СоздатьПодчиненныйЭлемент
("Субсчет");
СубсчетXML.УстановитьАтрибут("Код", Счет.Код);
// аналогично устанавливаем все атрибуты
// на элемент СубсчетXML
// …
СубсчетXML.Значение=Счет.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Корень.Записать(КаталогПрограммы()+"plan.xml");
КонецПроцедуры
В результате будет получен файл, фрагмент которого представлен на
рис.6.1.
А теперь приведем код для импорта плана счетов из xml-файла в новую
конфигурацию. Код модуля соответствующей обработки должен содержать
процедуру Выполнить(), которая имеет такой вид.
118
Программирование в среде 1С:Предприятие
Рис.6.1. XML-документ, содержащий информацию о плане счетов
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+
"v7plus.dll")<>1 Тогда
Предупреждение("Внешняя компонента не найдена");
Возврат;
КонецЕсли;
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Файл=Анализатор.СоздатьДокумент();
Файл.Загрузить(КаталогПрограммы()+"plan.xml");
План=Файл.ВыбратьУзел("ПланСчетов");
Кол=План.КоличествоПодчиненных();
Счет=СоздатьОбъект("Счет.Основной");
Для Инд=1 по Кол Цикл
СчетXML=План.ПолучитьПодчиненныйПоНомеру(Инд);
КолСубсчетов=СчетXML.КоличествоПодчиненных();
//подчиненным элементом является и содержимое элемента
Если КолСубсчетов>1 Тогда
Счет.Новый(1);
Иначе
Счет.Новый(0);
КонецЕсли;
Счет.Код=СчетXML.ПолучитьАтрибут("Код");
Счет.Наименование=СчетXML.Значение;
Счет.Валютный=СчетXML.ПолучитьАтрибут("Валютный");
Счет.Количественный=СчетXML.ПолучитьАтрибут
("Количественный");
Счет.Забалансовый=СчетXML.ПолучитьАтрибут
("Забалансовый");
119
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Если СчетXML.ПолучитьАтрибут("вид")="активный" Тогда
Счет.Активный=1;
ИначеЕсли СчетXML.ПолучитьАтрибут("вид")="пассивный"
Тогда
Счет.Активный=2;
Иначе
Счет.Активный=3;
КонецЕсли;
Счет.Записать();
Если КолСубсчетов>1 Тогда
Счет1=СоздатьОбъект("Счет.Основной");
Для Инд1=2 По КолСубсчетов Цикл
Субсчет=СчетXML.ПолучитьПодчиненныйПоНомеру(Инд1);
Счет1.Новый(0);
Счет1.Код=Субсчет.ПолучитьАтрибут("Код");
// аналогично устанавливаются все атрибуты
//создаваемого субсчета
// …
Счет1.Записать();
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
120
Программирование в среде 1С:Предприятие
Глава 7. Работа с метаданными
Метаданные, или словарь данных – это данные о данных.
Метаданные
содержат
полную
информацию
о
структуре
всех
пользовательских типов данных: констант, перечислений, справочников,
документов и т.п. Эта информация бывает полезна в том случае, если к
структуре данных нужно обратиться из кода какой-либо процедуры.
Возможность доступа к метаданным средствами встроенного языка является
очень удобной и может применяться в специальных случаях, например, для
создания универсальных отчетов или обработок, которые в разных ситуациях
могут обращаться к объектам различных видов.
В синтакс-помощнике версии 7.7 метаданные довольно плохо
документированы. К счастью, в справочную систему легко загрузить
дополнительные файлы справки (они имеют тип .als). Будем использовать
дополнительный справочный файл metadata.als (разработчик Моисеенко
П.П., Новосибирск, редакция от 09.12.01). Для подключения к синтакспомощнику нужно поместить этот файл в подкаталог BIN среды
1C:Предприятие. При следующей загрузке Конфигуратора в папке
Встроенный язык в конце списка подкаталогов появится новый подкаталог
Метаданные.
Работа
Существует
с
метаданными
глобальный
осуществляется
системный
объект
следующим
образом.
Метаданные,
который
предназначен для доступа к структуре метаданных текущей конфигурации.
Свойства и методы данного объекта позволяют получить информацию обо
всех деталях структуры данных нашей конфигурации.
Рассмотрим пример вывода полной информации обо всех константах.
Метод Константа() объекта Метаданные без параметров возвращает
количество
констант.
Вызов
того
же
метода
с
параметром:
Метаданные.Константа(Инд) позволяет получить ссылку на объектконстанту с порядковым номером Инд.
121
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Для Инд=1 По Метаданные.Константа() Цикл
Сообщить(СокрЛП(""+
Метаданные.Константа(Инд).Идентификатор));
Сообщить(СокрЛП("---"+
Метаданные.Константа(Инд).ПолныйИдентификатор()) );
Сообщить(СокрЛП("---"+Метаданные.Константа(Инд).Синоним));
Сообщить(СокрЛП("--"+
Метаданные.Константа(Инд).Комментарий));
Сообщить(СокрЛП("---"+
Метаданные.Константа(Инд).Периодический));
Сообщить(СокрЛП("---"+Метаданные.Константа(Инд).Тип));
Если Метаданные.Константа(Инд).Тип = "Справочник"
Тогда
Сообщить(СокрЛП("-Справочник- "+
Метаданные.Константа(Инд).Вид));
ИначеЕсли Метаданные.Константа(Инд).Тип = "Число"
Тогда
Сообщить(СокрЛП("-Точность-"+
Метаданные.Константа(Инд).Точность));
// можно вывести Разделять Триады и т.д.
ИначеЕсли Метаданные.Константа(Инд).Тип = "Строка"
Тогда
Сообщить(СокрЛП("-Длина строки-"+
Метаданные.Константа(Инд).Длина));
КонецЕсли;
КонецЦикла;
Далее рассмотрим пример обработки, в которой создается таблица
значений, содержащая информацию обо всех справочниках и документах
текущей конфигурации. Эта таблица значений в дальнейшем может быть
использована для выгрузки текущей конфигурации в какой-либо внешний
формат данных. Форма обработки приведена на рис.7.1.
На форму обработки помещен элемент управления ТаблицаЗначений
с идентификатором Таб. При запуске обработки вызывается процедура
ПриОткрытии(), которая заполняет эту таблицу значений.
122
Программирование в среде 1С:Предприятие
Рис.7.1. Форма для выгрузки структуры текущей
конфигурации в xml-документ
Процедура ПриОткрытии()
// определяем структуру таблицы значений
Таб.НоваяКолонка("выбор",0,0,0,"выбор",10);
Таб.НоваяКолонка("вид",0,0,0,"вид",20);
Таб.НоваяКолонка("идентификатор",0,0,0,
"идентификатор",20);
Таб.НоваяКолонка("путь",0,0,0,"полный идентификатор",20);
КолСпр = Метаданные.Справочник();
Для Инд=1 по КолСпр Цикл
Спр = Метаданные.Справочник(Инд);
Ид = Метаданные.Справочник(Инд).Идентификатор;
Ид1 = Метаданные.Справочник(Инд).ПолныйИдентификатор();
Таб.НоваяСтрока();
Таб.УстановитьЗначение(Инд,"идентификатор",Ид);
Таб.УстановитьЗначение(Инд,"вид","Справочник");
Таб.УстановитьЗначение(Инд,"выбор","не выбран");
Таб.УстановитьЗначение(Инд,"путь",Ид1);
КонецЦикла;
КолДок = Метаданные.Документ();
Для Инд=1 по КолДок Цикл
Док = Метаданные.Документ(Инд);
123
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Ид = Метаданные.Документ(Инд).Идентификатор;
Ид1 = Метаданные.Документ(Инд).ПолныйИдентификатор();
Таб.НоваяСтрока();
Таб.УстановитьЗначение(Инд+КолСпр,"идентификатор",Ид);
Таб.УстановитьЗначение(Инд+КолСпр,"вид","Документ");
Таб.УстановитьЗначение(Инд+КолСпр,"выбор","не выбран");
Таб.УстановитьЗначение(Инд+КолСпр,"путь",Ид1);
КонецЦикла;
КонецПроцедуры
Рассмотрим эту процедуру более подробно.
Сначала создаем в таблице значений четыре столбца. Первый столбец
служит для хранения булевского значения "выбран–не выбран", с помощью
этого столбца можно будет выбирать те справочники и документы, которые
нужно выгружать во внешний формат. В дальнейшем при двойном щелчке на
некоторой строке таблицы будет вызываться процедура, предназначенная для
изменения состояния текущего столбца выбор на противоположное.
Процедура Щелчок()
Если Таб.ПолучитьЗначение(Таб.ТекущаяСтрока(),"выбор")=
"не выбран" Тогда
Таб.УстановитьЗначение(Таб.ТекущаяСтрока(),
"выбор","выбран");
Иначе
Таб.УстановитьЗначение(Таб.ТекущаяСтрока(),
"выбор","не выбран");
КонецЕсли;
КонецПроцедуры
Остальные столбцы в таблице значений содержат информацию о
справочниках и документах: тип, идентификатор и полный идентификатор.
Метод
Справочник()
объекта
Метаданные,
вызванный
без
параметров, возвращает количество справочников в конфигурации. Вызов
того же метода с параметром: Метаданные.Справочник (Инд) позволяет
124
Программирование в среде 1С:Предприятие
получить ссылку на объект-справочник с порядковым номером Инд.
Аналогично работает и метод Документ() объекта Метаданные. По
окончании работы процедуры ПриОткрытии() мы имеем таблицу значений
с информацией обо всех справочниках и документах из текущей
конфигурации. По умолчанию в первом столбце во всех строках установлено
значение "не выбран".
Теперь рассмотрим процедуру, которая запускается при нажатии
кнопки Выгрузить. В нашем примере мы будем выгружать данные в xmlдокумент. Сначала, как и ранее, загружаем xml-анализатор и создаем xmlдокумент. Корневой элемент будет называться Данные, он имеет параметры
ИБ (каталог информационной базы), Дата и Филиал. Затем перебираем все
строки таблицы значений. Если значение в столбце "выбор" равно "выбран",
то данный справочник или документ будет выгружаться в xml-файл.
Процедура Выполнить()
Если ЗагрузитьВнешнююКомпоненту
(КаталогИБ() + "v7plus.dll") <> 1
Тогда
Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() +
"v7plus.dll") <> 1
Тогда
Предупреждение("Компонента v7plus.dll не найдена!");
КонецЕсли;
КонецЕсли;
Анализатор = СоздатьОбъект("AddIn.XMLParser");
Корень=Анализатор.СоздатьДокумент();
Данные =Корень.СоздатьПодчиненныйЭлемент("Данные");
Данные.УстановитьАтрибут("ИБ",КаталогИБ());
Данные.УстановитьАтрибут("Дата",Строка(РабочаяДата()));
Данные.УстановитьАтрибут("Филиал","Филиал1");
Справочники=Данные.СоздатьПодчиненныйЭлемент
("Справочники");
Документы=Данные.СоздатьПодчиненныйЭлемент("Документы");
Кол = Таб.КоличествоСтрок();
125
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Для Инд= 1 По Кол Цикл
Если Таб.ПолучитьЗначение(Инд,"выбор")="выбран" Тогда
// продолжение в следующей врезке
Рассмотрим блок обработки справочников. Ссылку на каждый
справочник
получаем
через
метаданные.
Справочники
могут
быть
многоуровневыми. Это требует соответствующей обработки. В данном
примере обрабатываются одно- и двухуровневые справочники.
Если Таб.ПолучитьЗначение(Инд,"вид")="Справочник" Тогда
Объект=Справочники.СоздатьПодчиненныйЭлемент
("Справочник");
Объект.УстановитьАтрибут("идентификатор",
Таб.ПолучитьЗначение(Инд,"идентификатор"));
Объект.УстановитьАтрибут("вид",
Таб.ПолучитьЗначение(Инд,"вид"));
Объект.УстановитьАтрибут("путь",
Таб.ПолучитьЗначение(Инд,"путь"));
МетаСпр=Метаданные.Справочник(
Таб.ПолучитьЗначение(Инд,"идентификатор"));
МетаСпр1=Таб.ПолучитьЗначение(Инд,"путь");
Спр = СоздатьОбъект(МетаСпр1);
Спр1 = СоздатьОбъект(МетаСпр1);
КолРек=МетаСпр.Реквизит();
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=0 Тогда
Элементы=Объект.СоздатьПодчиненныйЭлемент("элемент");
Элементы.УстановитьАтрибут("Вид","элемент");
Элементы.УстановитьАтрибут("Наименование",
Спр.Наименование);
Элементы.УстановитьАтрибут("Код",Спр.Код);
Для Ном=1 по КолРек Цикл
НазРек = МетаСпр.Реквизит(Ном);
Элементы.УстановитьАтрибут(НазРек.Идентификатор,
Спр.ПолучитьАтрибут(НазРек.Идентификатор));
КонецЦикла;
126
Программирование в среде 1С:Предприятие
Иначе
Элементы=Объект.СоздатьПодчиненныйЭлемент("элемент");
Элементы.УстановитьАтрибут("Вид","группа");
Элементы.УстановитьАтрибут("Наименование",
Спр.Наименование);
Элементы.УстановитьАтрибут("Код",Спр.Код);
Для Ном=1 по КолРек Цикл
НазРек = МетаСпр.Реквизит(Ном);
Элементы.УстановитьАтрибут(НазРек.Идентификатор,
Спр.ПолучитьАтрибут(НазРек.Идентификатор));
КонецЦикла;
Назв=Спр.Наименование;
Спр1.ИспользоватьРодителя(Спр);
Спр1.ВыбратьЭлементы();
Пока Спр1.ПолучитьЭлемент() = 1 Цикл
Если Спр1.ЭтоГруппа() = 1 Тогда
Прервать;
Иначе
Элемент=Элементы.СоздатьПодчиненныйЭлемент
("элемент");
Элемент.УстановитьАтрибут("Наименование",
Спр1.Наименование);
Элемент.УстановитьАтрибут("Код",Спр1.Код);
Для Ном=1 по КолРек Цикл
НазРек = МетаСпр.Реквизит(Ном);
Элемент.УстановитьАтрибут(НазРек.Идентификатор,
Спр1.ПолучитьАтрибут(НазРек.Идентификатор));
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
// продолжение на следующей врезке
Затем обрабатываем документы. Ссылку на каждый тип документа
получаем через метаданные. У каждого документа обрабатывается шапка и
табличная часть (если она есть).
127
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Иначе
Объект=Документы.СоздатьПодчиненныйЭлемент("ВидДокумента");
Объект.УстановитьАтрибут("идентификатор",
Таб.ПолучитьЗначение(Инд,"идентификатор"));
Объект.УстановитьАтрибут("вид",
Таб.ПолучитьЗначение(Инд,"вид"));
Объект.УстановитьАтрибут("путь",
Таб.ПолучитьЗначение(Инд,"путь"));
ТабЧасть = СоздатьОбъект("ТаблицаЗначений");
МетаДок = Метаданные.Документ(
Таб.ПолучитьЗначение(Инд,"идентификатор"));
МетаДок1 = Таб.ПолучитьЗначение(Инд,"путь");
Док = СоздатьОбъект(МетаДок1);
КолРекШапки = МетаДок.РеквизитШапки();
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент()=1 Цикл
ТекДок = Док.ТекущийДокумент();
Элементы=Объект.СоздатьПодчиненныйЭлемент("документ");
Элементы.УстановитьАтрибут("номер",
ТекДок.ПолучитьАтрибут("НомерДок"));
Элементы.УстановитьАтрибут("дата",
строка(ТекДок.ПолучитьАтрибут("ДатаДок")));
Элементы.УстановитьАтрибут("время",
ТекДок.ПолучитьВремя());
Элементы.УстановитьАтрибут("документ",ТекДок.Вид());
Для Ном=1 по КолРекШапки Цикл
НазРек = МетаДок.РеквизитШапки(Ном).Идентификатор;
ЗначРек=ТекДок.ПолучитьАтрибут(НазРек);
Элементы.УстановитьАтрибут(НазРек, строка(ЗначРек));
КонецЦикла;
ТекДок.ВыгрузитьТабличнуюЧасть(ТабЧасть);
КолСтрок = ТабЧасть.КоличествоСтрок();
Если КолСтрок>0 Тогда
Для Инд1= 1 По КолСтрок Цикл
Таб2=Элементы.СоздатьПодчиненныйЭлемент("Таб");
КолКол = ТабЧасть.КоличествоКолонок();
Для Инд2= 1 По КолКол Цикл
Таб2.УстановитьАтрибут
(ТабЧасть.ПолучитьПараметрыКолонки(Инд2),
""+ТабЧасть.ПолучитьЗначение(Инд1,Инд2));
КонецЦикла;
КонецЦикла;
128
Программирование в среде 1С:Предприятие
КонецЕсли;
КонецЦикла;
КонецЕсли;
// окончание на следующей врезке
По окончании обработки строк таблицы значений назначаем имя xmlфайлу и записываем его на диск.
КонецЕсли;
КонецЦикла;
ИмяФайла= "все.xml";
ПапкаФайла= КаталогИБ();
Корень.Записать(ПапкаФайла+ИмяФайла);
КонецПроцедуры
Итак, возможность обращения к метаданным является полезным
средством встроенного языка системы 1С:Предприятие. В некоторых
случаях, особенно при разработке универсальных процедур, работающих с
разными типами объектов, без использования метаданных не обойтись.
129
А.А. Андрианова, О.В. Пинягина, Т.М. Мухтарова
Литература
1.
1С: Предприятие 7.7. Конфигурирование и администрирование /
В.Байдаков, А.Борун, С.Нуралиев, Б.Федоров, В.Филиппов. – М.: , 2002. –
ч.1-2.
2.
1С: Предприятие 7.7. Описание встроенного языка / В.Байдаков,
А.Борун, Б.Федоров. – М.:, 2002. – ч. 1-2.
3.
1С:
Предприятие
7.7/8.0.
Системное
Михайлов А.В. – СПб.: БХВ-Петербург, 2005. – 336 с.
4.
Интернет-ресурс: http://www.mista.ru
130
программирование
/
Download