d9e5a92d

Глава 4 Язык программирования «1 С»

В этой главе приводится краткий обзор языка программирования «1С». Его полное описание можно найти, например, в книге «1С:Предприятие, версия 7.7. Описание встроенного языка», которая содержит 900 страниц и продается вместе с продуктами фирмы «1С». Дополнительную информацию вы можете найти в Интернете.

Агрегатные типы данных

Глава 4 Язык программирования «1 С»


В системе «1С» поддерживаются базовые и агрегатные типы данных. К базовым типам относятся числа, строки и даты. Агрегатные типы данных — это специализированные типы, предназначенные для работы с объектами «1 С.Пред-приятия».

• Константа — средство работы с постоянными (или условно постоянными) значениями. В константах хранится информация, которая не изменяется или изменяется достаточно редко, например название организации или почтовый адрес.

Перечень констант, доступный в конкретной конфигурации, их названия и типы определяются в Конфигураторе.

• Справочник — средство для ведения списков однородных элементов данных. Помимо наименования элементов, данных списки могут содержать дополнительную информацию. Физическим аналогом справочника является картотека. Каждая карточка — это элемент справочника, а сведения, заносимые в карточку, являются реквизитами справочника. Перечень справочников, доступных в конкретной конфигурации, их названия и реквизиты определяются в Конфигураторе.

• Перечисление — средство работы с элементами данных, список возможных значений которых жестко задан (например, для перечисления Булево можно задать возможные значения: Да, Нет). В отличие от справочников, списки значений в перечислении задаются в процессе их создания в Конфигураторе и при выполнении задачи не могут быть изменены. Состав перечислений, доступных в конкретной конфигурации, их названия и допустимые значения определяются в Конфигураторе.

• Документ — средство для ввода первичной информации о совершаемых хозяйственных операциях. Перечень документов, доступных в конкретной



конфигурации, их названия, реквизиты и другие свойства определяются в Конфигураторе.

• Запрос — средство для выполнения обращения к документам, регистрам, справочникам и журналам расчетов с целью получения сводной информации при формировании выходных отчетов. В программных модулях допускается создавать произвольное число объектов типа Запрос при помощи вызова системной функции СоздатьОбъект.

• Текст — средство работы с текстовыми документами. В программных модулях допускается создание произвольного числа объектов типа Текст при помощи вызова системной функции СоздатьОбъект.

• Таблица — средство работы с таблицами (отчетами). В программных модулях допускается создание произвольного числа объектов типа Таблица при помощи вызова системной функции СоздатьОбъект.

• СписокЗначений — средство для создания списка значений каких-либо данных, позволяющего в дальнейшем сортировать и выбирать нужные значения из списка. При добавлении в диалоговых формах полей типа Список или Поле со списком система автоматически создает объекты СписокЗначений, доступ к которым в языке возможен по идентификатору поля. В программных модулях допускается создание произвольного числа объектов типа СписокЗначений при помощи вызова системной функции СоздатьОбъект.

• ТаблицаЗначений — средство для создания списка значений каких-либо данных, позволяющего в дальнейшем сортировать и выбирать нужные значения из списка. При добавлении в диалоговых формах полей типа Список или Поле со списком система автоматически создает объекты СписокЗначений, доступ к которым в языке возможен по идентификатору поля. В программных модулях допускается создание произвольного числа объектов типа СписокЗначений при помощи вызова системной функции СоздатьОбъект.

• Картинка — средство для работы с графическими файлами. При добавлении в диалоговых формах и в таблицах полей типа Картинка система автоматически создает объекты Картинка, доступ к которым в языке возможен по идентификатору поля. В программных модулях допускается создание произвольного числа объектов типа Картинка при помощи вызова системной функции СоздатьОбъект.

• Периодический — средство для работы с периодическими реквизитами справочников и периодическими константами. В программных модулях допускается1 создание произвольного числа объектов типа Периодический при помощи вызова системной функции СоздатьОбъект.

• ФС — средство для работы с дисковыми файлами непосредственно из встроенного языка системы «1С:Предприятие». В программных модулях допускается создание произвольного числа объектов типа ФС при помощи вызова системной функции СоздатьОбъект. Кроме того, в глобальном контексте по умолчанию существует один уже созданный объект этого типа с именем ФС (имя объекта совпадает с названием агрегатного типа данных).

• XBase — средство для работы с файлами баз данных DBF-формата непосредственно из встроенного языка системы «1С:Предприятие». В программных модулях допускается создание произвольного числа объектов типа XBase при помощи вызова системной функции СоздатьОбъект.

Следующие типы данных доступны только при наличии компоненты «Бухгалтерия».

• ПланСчетов (служебный тип данных) предназначен для идентификации Плана счетов, созданного в метаданных. Тип значения ПланСчетов не поддерживает никаких данных в информационной базе, а список возможных значений этого типа данных определен планами счетов, созданными в конфигурации. Для получения значения такого типа данных используется глобальный атрибут ПланыСчетов, который имеет, в свою очередь, набор атрибутов типа ПланСчетов, соответствующих имеющимся в конфигурации планам счетов.

• ВидСубконто (служебный тип данных) предназначен для идентификации вида субконто, созданного в метаданных. Список возможных значений этого типа данных определен видами субконто, созданными в конфигурации. Для получения значения такого типа используется глобальный атрибут ВидыСубконто, который имеет, в свою очередь, набор атрибутов типа ВидСубконто, соответствующих имеющимся видам субконто. Кроме того, глобальный атрибут ВидыСубконто имеет методы для обхода всех существующих видов субконто.

• Операция — средство для работы из встроенного языка с данными бухгалтерских операций и проводок, формируемых документом. Так как проводки в системе «1 С: Предприятие» принадлежат операциям, то управление и операциями, и проводками выполняется объектом Операция.

• БухгалтерскиеИтоги — средство для организации доступа к бухгалтерским итогам в различных разрезах, за различные периоды и с разной степенью детализации. При наличии в системе «1С:Предприятие» компоненты «Бухгалтерия» система автоматически реализует специальный механизм работы с бухгалтерскими итогами. Данный механизм обеспечивает хранение, динамический пересчет бухгалтерских итогов и их извлечение средствами встроенного языка. Система хранения бухгалтерских итогов поддерживается системой «1 С:Предприятие» автоматически на основе существующих планов счетов. При редактировании планов счетов — в Конфигураторе или при работе с системой «1С:Предприятие» — для счета может быть установлен ряд свойств, влияющих на организацию хранения бухгалтерских итогов: это признаки ведения валютного и количественного учета, а также включение аналитического учета по субконто. Изменение бухгалтерских итогов может производиться только проводками бухгалтерских операций.

Следующий тип данных доступен только при наличии компоненты «Оперативный учет».

• Регистры — средство накопления сводной информации. Регистры состоят из измерений, ресурсов и реквизитов. Регистры позволяют определять начальный, конечный остаток и обороты ресурсов, а также производить фильтрацию данных по реквизитам. Регистры могут изменяться только из документов. Регистр отчасти является аналогом бухгалтерских итогов.

Справочники_77

Каждый агрегатный тип данных, как правило, имеет набор атрибутов и методов. Атрибуты по свойствам напоминают переменные, то есть им можно присваивать значения и считывать их. Методы — это те действия, которые может выполнять агрегатный тип данных. Методы могут иметь или не иметь возвращаемое значение. Если метод имеет возвращаемое значение, то он может размещаться в правой части оператора присваивания в выражениях и в описании фактических параметров других вызываемых методов, процедур или функций.

Типичная последовательность работы с объектом агрегатного типа выглядит следующим образом.

1. С помощью функции СоздатьОбъект создается объект агрегатного-типа и какой-либо переменной присваивается ссылка на него.

2. Объект позиционируется на нужном элементе данных.

3. Манипуляции с объектом агрегатного типа производятся через вызовы методов и обращения к его атрибутам.

В том случае, если объект агрегатного типа больше не нужен, он может быть отсоединен от переменной посредством присваивания ей какого-либо значения базового типа (например, числа 0).

Пример использования функции СоздатьОбъект:

// Создаем объект.

Тов = СоздатьОбъект("Справочник.Номенклатура");

// Производим манипуляции с объектом.

Тов.ВыбратьЭлементы();

Пока Тов.ПолучитьЭлемент() = 1 Цикл

Сообщить("Наименование товара " + Тов.Наименование);

КонецЦикла;

Отсоединение объекта выполнять необязательно.

Справочники

Справочник — это агрегатный тип данных, предназначенный для работы со списками однородных элементов данных. Название и структура каждого конкретного справочника определяются при его создании в Конфигураторе. У любого справочника существуют два реквизита, которые создаются автоматически: Код и Наименование.

Ниже приведены основные методы работы с элементами справочников.

Метод НайтиЭлемент

Метод НайтиЭлемент производит поиск элемента справочника. Рассмотрим пример записи цены в карточку товара:

Тов = СоздатьОбъект("Справочник.Номенклатура");

Тов.НайтиЭлемент(Запрос.Тов);

Тов.Цена = 0;

Тов.Записать();

Казалось бы, получилось «масло масляное»: стоит ли находить элемент, если он и так найден? Однако операция Записать применима только к тем объектам, которые созданы командой СоздатьОбъект. То есть следующий код будет некорректным:

Запрос.Тов.Цена = О/

.Запрос.Тов.Записать();

Поиск элемента справочника

Для поиска элемента справочника используются следующие методы:

• НайтиЭлемент (<Элемент>),

• НайтиПоКоду (<Код>, <ФлагПоиска>) ,

• НайтиПоНаименованию (<Наименование>, <Режим>, <ФлагПоиска>),

• НайтиПоРеквизиту (<Реквизит>, <3начение>).

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

Пример поиска элемента справочника:

Функция ПоискЭлемента(Справ,Наим)

Спр = СоздатьОбъект("Справочник");

Спр.Вид(Справ);

Если Спр.НайтиПоНаименованию(Наим,0) = 0 Тогда Спр.Новый();

Спр.Наименование = Наим;

Спр.Записать();

КонецЕсли;

Возврат Спр.ТекущийЭлемент();

КонецФункции

Глава 4 Язык программирования «1 С»


Выборка элементов справочника

Для обработки элементов справочника можно использовать следующую последовательность команд:

Тов =

СоздатьОбъект("Справочник.Товары");

Тов.ВыбратьЭлементы();

Пока Тов.ПолучитьЭлемент() = 1 Цикл Если Тов.ЭтоГруппа() = 1 Тогда // Если это группа товаров,

// то пропускаем.

Продолжить;

КонецЕсли;

Сообщить("Товар " + Тов.Код + " " +

Тов.Наименование);

КонецЦикла;

Другие полезные команды, которые связаны с выборкой элементов справочника:

Справочники_79

• Спр .ИспользоватьВладельца (<Владелец>),

• Спр.ИспользоватьРодителя (<Группа>).

Работа с группами элементов

Справочник может иметь иерархическую структуру. Число уровней иерархии определяется в поле Кол-во уровней в окне редактирования. Наиболее важные функции:

• ЭтоГруппа () — возвращает 1, если текущий элемент справочника — группа;

• ПринадлежитГруппе (<Группа>) — возвращает 1, если текущий элемент принадлежит указанной группе;

• Уровень () — возвращает номер уровня текущего элемента.

Добавление нового элемента и группы в справочник

Для добавления нового элемента в справочник используется метод Новый:

Спр = СоздатьОбъект(”Справочник.Номенклатура”);

Спр.Новый();

Спр.Наименование = "Новый элемент”;

Спр .Записать();

Для добавления новой группы в справочник используется метод Но-ваяГруппа:

Спр.НоваяГруппа();

Спр.Наименование = "Новая группа элементов";

Спр.Записать();

Работа с подчиненными справочниками

Подчиненный справочник позволяет организовать отношение «один ко многим». Каждому элементу справочника-владельца будет соответствовать свой набор элементов подчиненного справочника. Например, один элемент справочника Товар может иметь несколько связей с элементами справочника Цены.

Если один справочник подчинен другому, то это следует указать в поле подчинен окна редактирования.

Для обработки подчиненного справочника можно использовать следующий код:

Тов = СоздатьОбъект(”Справочник.Товары”);

Цен = СоздатьОбъект(”Справочник. Цены”);

Тов.ВыбратьЭлементы();

Пока Тов.ПолучитьЭлемент() = 1 Цикл

Сообщить(”Товар ” + Тов.Код + ” ” + Тов.Наименование) ;

Цен.ИспользоватьВладельца(Тов.ТекущийЭлемент());

Цен.ИспользоватьДату(ТекущаяДата());

Цен.ВыбратьЭлементы();

Пока Цен.ПолучитьЭлемент() = 1 Цикл

Сообщить(”Цена товара ” + Цен.Цена + ” ” + Цен.ВидЦены);

КонецЦикла;

КонецЦикла;

Программа показывает список цен (подчиненный справочник Цены) для каждого товара справочника Товары.

Документы

Документы в системе «1С:Предприятие» используются для ввода, просмотра и корректировки информации о совершаемых хозяйственных операциях. У любого документа есть три обязательных реквизита: ДатаДок, ВремяДок, Номер-Док. Дата и время — наиболее важные характеристики документов, так как позволяют устанавливать строгую временную последовательность совершения операций. Форма документа редактируется при нажатии кнопки Форма.

Реквизиты шапки документа задаются в списке Реквизиты шапки. Реквизиты табличной части задаются в списке Реквизиты табличной части.

Проведение документа

Для того чтобы документ формировал проводки, необходимо создать хотя бы один план счетов и установить флажки Разрешить проведение документа и Бухгалтерский учет (Конфигуратор • Конфигурация • Открыть • Конфигурацию • Документ • <Конкретный документ> • Редактировать). Если документ будет формировать движение регистров, следует установить флажок Оперативный учет.

Пример формирования проводок документом:

Операция.НоваяПроводка();

Операция.СодержаниеПроводки = "Поступили товары";

Операция.НомерЖурнала = "ТВ";

Операция.Дебет.Счет = СчетПоКоду("41.1");

Операция.Дебет.Номенклатура = Товар;

Операция.Кредит.Счет = СчетПоКоду("60.1") ;

Операция.Кредит.Контрагенты = Контрагент;

Операция.Кредит.Договоры = Договор;

Операция.Количество = Количество;

Операция.Сумма = УчетнаяСтоимость;

Операция.Записать();

Пример формирования движений регистров при проведении документа:

Процедура Кеги(Док) Экспорт

Док.ВыбратьСтроки();

ДокВид = Док.Вид() ;

Пока Док.ПолучитьСтроку() = 1 Цикл

Per = Док.Регистр.Кеги;

Если (Док.Товар.ВидТовара о Перечисление.ВидыТоваров.Тара) Тогда

// Если это не тара, то продолжить.

Продолжить;

КонецЕсли ;

Per.Клиент = Док.Клиент;

Per.Товар = Док.Товар;

Per.Количество = Док.Количество;

Если ДокВид = "РасходнаяНакладная" Тогда Р?г.ДвижениеПриходВыполнить ();

ИначеЕсли ДокВид = "ПриходнаяНакладная" Тогда P?г.ДвижениеРасходВыполнить();

КонецЕсли;

КонецЦикла;

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

Выборка документов

Для выборки документов можно использовать следующую последовательность команд:

Процедура Сформировать()

Док = СоздатьОбъект("Документ");

Док.ВыбратьДокументы();

Пока Док.ПолучитьДокумент() = 1 Цикл

Сообщить("Документ - " + Док.Вид() + " " + Док.ДатаДок + " "

+ Док.НомерДок);

Док.ВыбратьСтроки();

Пока Док.ПолучитьСтроку() = 1 Цикл

Сообщить("Товар - " + Док.Товар);

КонецЦикла;

КонецЦикла;

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

Создание нового документа

Для ввода документа используется метод Новый. Для ввода новой строки документа используется метод НоваяСтрока. Для записи документа используется метод Записать. Для проведения документа используется метод Провести. Пример создания нового документа:

Процедура Сформировать()

Док * СоздатьОбъект("Документ.РасходнаяНакладная");

Док.Новый();

Док.ДатаДок = ТекущаяДата();

Табз.ВыбратьСтроки();

Пока Табз.ПолучитьСтроку() = 1 Цикл Док.НоваяСтрока();

Док.Товар = Табз.Товар;

Док.Количество = Табз.Количество;

Док.Цена = Док.Товар.Цена1;

КонецЦикла;

Док.Записать( ) ;

Док.Провести( ) ;

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

Использование печатных форм (объект Таблица)

Для создания печатных форм и для ввода табличных данных используется объект Таблица. Таблицы могут располагаться в разделе Общие таблицы и в фор-

Таблица является шаблоном для вывода данных. В свойствах каждой ячейки можно задать ее тип: Текст, Выражение, Шаблон и Фиксированный шаблон. Текст печатается так, как он задан в Конфигураторе. Выражение вычисляется, и в ячейке записывается результат. Шаблон — это текст, в котором может присутствовать выражение, которое задается в квадратных скобках, например "Сумма равна [ПечСумма] ".

Пример использования объекта Таблица:

Таб = СоздатьОбъект("Таблица");

Таб.ИсходнаяТаблица("Накладная");

Таб.ВывестиСекцию("Шапка");

Док.ВыбратьСтроки();

Пока Док.ПолучитьСтроку() = 1 Цикл

Таб.ВывестиСекцию("Строка|Тело"); Таб.ПрисоединитьСекцию("Строка|НП");

КонецЦикла;

Таб.ВывестиСекцию("Подвал");

Таб.Показать();

В Конфигураторе предусмотрен легкий для понимания конструктор печатных форм: Конфигуратор • Конструкторы • Макет отчета. Советую начать конструирование печатных форм с него.

Объект СписокЗначений



Объект СписокЗначений применяется для создания динамических списков (не сохраняемых в БД), которые могут отображаться в диалоговых формах (элементы Список и Поле со списком). Основные возможности использования списка значений:

• выбирать значение из заранее составленного списка;

• добавлять новые элементы в список значений;

• сортировать список;

• удалять элементы списка.

Элемент списка содержит три поля: Значение,

Представление и Пометка. Значения могут быть данными любого типа, представление же всегда имеет тип Строка. В форме диалога отображается представление (если оно задано). Пометка означает, помечено данное значение или нет.

Основные функции работы со списком следующие:

• ДобавитьЗначение (<3начение>,<Строка>),

• ПолучитьЗначение (<Позиция>, <Переменная>) ,

• Получить (<Строка>),

• УдалитьЗначение (<Позиция>, <Количество>),

• УдалитьВсе (),

• Сортировать {<Направление>)у

• Принадлежит (<3начение>),

• ИзСтрокиСРазделителями (<Строка>),

• ВСтрокуСРазделителями (),

• РазмерСписка (),

• НайтиЗначение (<3начение>).

Пример использования списка значений:

// Процедура используется в обработке подбора таблицы значений. Процедура ОбработкаПодбора(ЗначПод)

Если (ЗначПод.Вид() = "Номенклатура") Тогда Если ЗначПод.ЭтоГруппа() = 0 Тогда

ВыбТовары.ДобавитьЗначение(ЗначПод);

ВыбТовары.ТекущаяСтрока(ВыбТовары.РазмерСписка());

Форма.УдалитьСтрокуТовара.Доступность(1);

КонецЕсли;

КонецЕсли;

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

ВыбТовары — это объект типа Список, который находится на форме диалогового окна отчета.

Чтобы определить, входит ли выбранный элемент в список значений, можно использовать следующий код (ВыбТовары — список значений):

Функция Товар(Тов)

Если ВыбТовары.РазмерСписка() = 0 Тогда Возврат 1;

КонецЕсли;

Если ВыбТовары.НайтиЗначение(Тов) <> 0 Тогда Возврат 1;

КонецЕсли;

Возврат 0;

КонецФункции

Объект ТаблицаЗначений

Объект ТаблицаЗначений применяется для создания динамических массивов (не сохраняемых в БД), которые могут отображаться в диалоговых формах (элемент Таблица значений). Таблицазначений создается с помощью функции СоздатьОбъект ("ТаблицаЗначений11), либо визуально при добавлении на форму элементов Таблица значений.

Основные функции работы с таблицей значений:

• НоваяКолонка( <Идентификатор >,< Тип>,<Длина>, <Точность>, <3аголовок>г<Ширина >, <Формат >, <Положение>);

• НоваяСтрока ();

• УдалитьСтроку{<НомерСтроки>);

• УдалитьСтроки ();

• ПолучитьСтрокуПоНомеру {<НомерСтроки>);

• ВыбратьСтроки () — открыть выборку строк из таблицы значений;

• ПолучитьСтроку () — получить следующую строку из выборки;

• Сортировать (<Колонки>) — в качестве параметра используется строка, содержащая список идентификаторов или номеров колонок, разделенных запятой, по которым выполняется сортировка строк таблицы значений;

• Свернуть (<ГрупКолонки>, <СумКолонки>) — первый параметр (строка ГрупКолонки) содержит список идентификаторов или номеров колонок, разделенных запятой, по которым выполняется группировка строк таблицы значений (то есть если в группируемых колонках имеется несколько строк с одинаковыми значениями, то в результате свертки останется одна такая строка); второй параметр (строка СумКолонки) содержит список идентификаторов или номеров колонок, разделенных запятой, в которых выполняется суммирование значений строк таблицы значений (то есть если группируется несколько строк, то значения суммируемых колонок будут складываться).

Пример инициализации таблицы значений:

Табз=СоздатьОбъект("ТаблицаЗначений");

// Полное определение реквизитов колонки

Табз.НоваяКолонка ("Товар", "Строка", 20,, "Наименование товара", 20);

// Можно делать сокращенное определение реквизитов колонки.

Табз.НоваяКолонка("Цена");

Табз.НоваяКолонка("Количество") ;

Док.ВыбратьСтроки();

Пока Док . ПолучитьСтроку ( ) = 1 Цикл

// Ввод новой строки таблицы значений Табз.НоваяСтрока();

Табз.Товар = Док.Товар;

Табз.Цена = Док.Цена;

Табз.Количество = Док.Количество;

КонецЦикла;

Пример показывает, как можно создавать колонки и строки таблицы значений.

Выгрузка запроса в таблицу значений

В приведенном ниже примере результаты запроса записываются в таблицу значений:

Перем Запрос, ТекстЗапроса, Таб;

Запрос = СоздатьОбъект("Запрос" ) ;

ТекстЗапроса = "//{{ЗАПРОС(Сформировать)

I Период с ВыбНачПериода по ВыбКонПериода;

I док = Документ.рн.ТекущийДокумент,Документ.пн.ТекущийДокумент;

ІТов = Документ.рн.Товар, Документ.пн.Товар;

I Кол = Документ.рн.Количество, Документ.пн.Количество;

|Акц = Документ.рн.Акциз, Документ.пн.Акциз;

ІВидОп = Документ.рн.ВидОперации, Документ.пн.ВидОперации;

ІФункция КолСумма = Сумма(Кол);

|Функция АкцСумма = Сумма(Акц);

|Группировка док;

Группировка Тов без групп;

Г'//} }ЗАПРОС

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат;

КонецЕсли;

// Выгрузка результатов запроса в таблицу значений Табз = СоздатьОбъект(”ТаблицаЗначений”);

Запрос.выгрузить(Табз);

Табз.НоваяКолонка(мАкцизм);

Табз.ВыбратьСтроки();

Пока Табз.ПолучитьСтроку() = 1 Цикл

Табз.Акциз = ”” + Табз.Тов.ГруппаАкциза;

Сообщить(”Товар ” + Табз.Тов);

КонецЦикла;

После того как результаты запроса выгружены в таблицу значений, программист может добавлять в таблицу значений новые колонки, сортировать строки таблицы и сворачивать данные. Использование таблицы значений может значительно упростить программу.

Выгрузка итогов по регистру в таблицу значений

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

Per = СоздатьОбъект("Регистр.Товары"); |

ТабЗнач = СоздатьОбъект("ТаблицаЗначений");

// Выгрузка итогов в таблицу значений Рег.ВыгрузитьИтоги(ТабЗнач);

ТабЗнач.ВыбратьСтроки();

Пока ТабЗнач.ПолучитьСтроку() = 1 Цикл Сообщить("Товар " + ТабЗнач.Товар +

" на складе " + ТабЗнач.Товар +

" кол-во: " + ТабЗнач.Количество);

КонецЦикла;

Сортировка табличной части документа при помощи таблицы значений

Ниже приведен пример сортировки табличной части документа при помощи таблицы значений. Для сортировки необходимо выгрузить данные табличной части документа в таблицу значений, добавить в таблицу значений новую колонку, по которой будет происходить сортировка, заполнить колонку значениями, по которым будет происходить сортировка, отсортировать таблицу и загрузить ее в документ.

Процедура Сортировка()

Табз = СоздатьОбъект("ТаблицаЗначений");

ВыгрузитьТабличнуюЧасть(Табз);

Табз.НоваяКолонка("Родитель");

Табз.ВыбратьСтроки();

Пока Табз.ПолучитьСтроку() = 1 Цикл

// Предполагается, что в табличной части документа // существует реквизит "Товар".

Табз.Родитель = "" + Табз.Товар.Родитель;

КонецЦикла;

Табз.Сортировать("+Родитель");

ЗагрузитьТабличнуюЧасть(Табз);

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

Вы можете использовать приведенный код в качестве шаблона манипуляции данными табличной части документа, например, когда требуется печатать строки в документе в определенном порядке или сворачивать строки с одинаковыми товарами.

Как получать управление других форм?

В первый раз вы столкнетесь с понятием «контекст», когда начнете анализировать модуль проведения документов. Возможно, оно будет употреблено в такой конструкции:

ПроцедураДвойныеСтроки(Контекст) ;

В процедуру, обрабатывающую двойные строки, передается управление документом, для того чтобы процедура, находящаяся вне модуля, могла проводить, записывать, удалять строки или менять реквизиты.

Каждый объектно-ориентированный язык позволяет обращаться к одному объекту из другого. Не является исключением и «1С», где обращение происходит через ссылку на объект, который называется Контекст.

Как открыть форму и оставить ниточки управления у себя?



В справке по 1С-методам находится раздел, посвященный методу ОткрытьФорму. Первый параметр команды используется для заголовка открытой формы, а второй — для передачи параметров:

конт = Форма.Параметр;

В переменной конт будет переданный параметр. Если конт — это контекст, тогда его можно использовать для доступа к реквизитам документа, методам справочника, объектам на форме и т. д.:

Процедура Сформировать() конт = "";

ОткрытьФорму("Отчет.ОбработкаСклада",

конт ) ;

Если типЗначения(к) = 100 Тогда // Проверяем, открыта ли форма. конт.Склад = Константа.ОсновнойСклад; конт.Фирма = Фирма; конт.Дата_ = ДатаДок; конт.форма.Обновить(1) ;

КонецЕсли;

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

Процедура устанавливает реквизиты в открываемой форме.

Как открыть форму и передать ей бразды правления?

Для того чтобы передать управление другой форме (открывающая форма руководится открываемой формой), можно использовать следующую конструкцию:

// Открывающая Форма Процедура Сформировать()

ОткрытьФорму("Обработка.ОбработкаСклада", Контекст) ;

КонецПроцедуры // Открываемая форма Процедура ПриОткрытии()

Конт = Форма.Параметр;

Если типЗначения(конт) = 100 Тогда pi = Конт.зн1/ р2 = Конт.зн2; рЗ = Конт.знЗ; контА.Форма.Закрыть(0);

КонецЕсли;

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

С помощью описанного выше механизма в «1 С» организованы процедуры Подбор и ВводНаОсновании.

Как передать данные из одной формы в другую?

Допустим, требуется написать обработку, в которую передавались бы данные, но при этом не было бы привязки ни к существующим документам, ни к определяемым в глобальном модуле переменным.

В открывающей форме для этого следует написать следующую процедуру:

Процедура Сформировать()

ПередаваемаяПеременная = "Привет";

ОткрытьФорму("Отчет.ПринимающийОтчет" , ПередаваемаяПеременная) ; КонецПроцедуры

В принимающей форме необходимо использовать процедуру ПриОткрытии:

Процедура ПриОткрытии()

Если ПустоеЗначение(форма.Параметр) = 1 Тогда Возврат; // Ничего не передали иначе

к = форма.Параметр; сообщить();

КонецЕсли;

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

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

// Открывающая форма Процедура Сформировать()

список = СоздатьОбъект("СписокЗначений"); список.ДобавитьЗначение(зн1) ; список.ДобавитьЗначение(зн2); список.ДобавитьЗначение(знЗ);

список.ДобавитьЗначение(3HN) ;

ОткрытьФорму("Отчет.ОченьНужный", список) ;

КонецПроцедуры // Открываемая форма Процедура ПриОткрытии() список = форма.Параметр;

Если ПустоеЗначение(список) = 1 Тогда Возврат; конецЕсли;

Если ТипЗначенияСтр(список) = "СписокЗначений" Тогда nl = список.ПолучитьЗначение(1); п2 = список.ПолучитьЗначение(2); пЗ = список.ПолучитьЗначение(3);

nN = список.ПолучитьЗначение(N); иначе

КонецЕсли;

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

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

Применение запросов

ПРИМЕЧАНИЕ Не следует путать запрос в программировании с бухгалтерским запросом.

Запрос создается функцией СоздатьОбъект ("Запрос"). Для выполнения запроса используется метод Выполнить (<ТекстЗапроса>), который возвращает 1, если запрос выполнился. <ТекстЗапроса> — это строковое выражение на языке запросов.

Пример использования запроса, который анализирует расходные накладные и показывает количество отгрузок со складов для каждого товара:

НашЗапрос = СоздатьОбъект("Запрос");

ТекстЗапроса = "//{{ЗАПРОС(Сформировать)

I СКЛАД = Документ.РасходнаяНакладная.Склад;

I ТОВАР = Документ.РасходнаяНакладная.Товар;

I КОЛИЧЕСТВО = Документ.РасходнаяНакладная.Количество;

(Группировка ТОВАР Упорядочить По ТОВАР.Код;

(Группировка СКЛАД Упорядочить По СКЛАД.Код;

Применение запросов_89

| Функция КСЛ = Сумма(КОЛИЧЕСТВО);

|//}}ЗАПРОС";

// Если ошибка в запросе, выходим из процедуры.

Если НашЗапрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат;

КонецЕсли;

Приведем пример использования запроса. Допустим, в конфигурации «Торговля» версии 9.* понадобилось изменить мелкооптовые цены в зависимости от оптовых цен. Код программы без применения запросов может выглядеть так: Процедура Сформировать()

Тов = СоздатьОбъект("Справочник. Номенклатура");

Цена = СоздатьОбъект("Справочник.Цены");

Если Группа.Выбран() =1 Тогда

Т ов.ИспользоватьРодителя(Группа);

КонецЕсли;

Тов.ВыбратьЭлементы();

Пока Тов.ПолучитьЭлемент() = 1 Цикл Если Тов.ЭтоГруппа() = 1 Тогда продолжить;

КонецЕсли;

состояние(Тов.Наименование) ;

Цена.ИспользоватьВладельца(Тов);

Исх = 0;

Цена.ВыбратьЭлементы();

Пока Цена.ПолучитьЭлемент() = 1 Цикл

Если Цена.ТипЦен = ИсхЦ Тогда j

Исх = Цена.Цена.Получить(ВыбДата); прервать;

КонецЕсли;

КонецЦикла;

Цена.ВыбратьЭлементы();

Пока Цена.ПолучитьЭлемент() = 1 Цикл Если Цена.ТипЦен = ТипЦ Тогда

Цена.Цена.Установить(ВыбДата, ( (100 + Процент)/ 100)*Исх);

Цена.Записать();

прервать;

КонецЕсли;

КонецЦикла;

КонецЦикла;

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

А теперь спроектируем программу с применением запросов.

Как и во всяком языке запросов, в начале запроса идет описание переменных, а затем описываются операции с переменными.

Для автоматического формирования кода запросов в «1С» предусмотрен помощник (Конфигуратор • Конструкторы • Запрос). Новичку советую разобраться, как работает конструктор, а не пытаться писать запросы самостоятельно. Писать запросы вручную долго и утомительно.

Приведенный выше пример изменения цен товаров при помощи запроса будет решаться следующим образом:

// Процедура генерации запроса Сформировать Процедура Сформировать()

Перем Запрос, ТекстЗапроса;

// Создание объекта типа Запрос

Цена = СоздатьОбъект("Справочник.Цены");

Запрос = СоздатьОбъект("Запрос");

ТекстЗапроса = "//{{ЗАПРОС(Сформировать)

| Период с ВыбДата по ВыбДата,•

|Ц = Справочник.Цены.ТекущийЭлемент;

!Тов = Справочник.Цены.Владелец;

|Тип = Справочник.Цены.ТипЦен;

I Цена = Справочник.Цены.Цена;

| Функция Счётчик = Счётчик() ;

// Обращаю внимание, что слово Счётчик пишется через ё.

// Если будет написано через е, запрос выполнен не будет. (Группировка Тов;

(Группировка Тип;

|Условие(Тов в Группа);

Г//}} ЗАПРОС;

// Если возникла ошибка в запросе, выходим из процедуры.

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат;

КонецЕсли;

// Группировка по товарам Пока Запрос.Группировка(1) = 1 Цикл

Если Запрос.Тов.ЭтоГруппа() = 1 Тогда продолжить;

КонецЕсли;

Исх = 0;

состояние(Запрос.Тов.Наименование);

// Группировка по типам цен Пока Запрос.Группировка(2) = 1 Цикл Если Запрос.Тип = ИсхЦ Тогда Исх = Запрос.Цена;

КонецЕсли;

Если Запрос.Тип = ТипЦ Тогда

Цена.НайтиЭлемент(Запрос.Ц);

КонецЕсли;

КонецЦикла;

// В переменной Цена получаем цену, которую нужно // пересчитать,

// в Исх — исходную цену.

// Для проверки выясняем, все ли выбрано.

Если Исх = 0 Тогда продолжить;

ИначеЕсли Цена.Выбран() = 0 Тогда продолжить;

КонецЕсли;

Цена.Цена.Установить(ВыбДата, ( (100 + Процент)/100)*Исх); Цена.Записать();

КонецЦикла;

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

Бухгалтерские итоги



При наличии в системе «1С:Предприятие» компоненты «Бухгалтерия» система предоставляет доступ к механизму, который обеспечивает хранение, динамический пересчет и извлечение бухгалтерских итогов средствами встроенного языка.

Хранение итогов поддерживается системой с детализацией до месяца. В итогах хранятся остатки и обороты по счетам с детализацией по субконто и обороты между счетами (без детализации по субконто).

Изменение бухгалтерских итогов может производиться проводками бухгалтерских операций.

Обращение к бухгалтерским итогам выполняется при помощи агрегатного объекта типа БухгалтерскиеИтоги. Объект может работать в трех режимах:

i работа с основными итогами,

• работа с временными итогами,

• работа в режиме запроса.

Объект типа БухгалтерскиеИтоги при создании функцией СоздатьОбъ-ект работает в первом режиме. Переключение в другие режимы производится функциями Рассчитать и ВыполнитьЗапрос. Функции ИспользоватьПлан-Счетов и ИспользоватьРазделительУчета позволяют назначить План счетов и разделитель учета, по которым будут выдаваться итоги.

Работа с операциями и проводками



Для отражения в бухгалтерском учете информации о движении средств используются объекты типа Операция и Проводка.

Объект Операция используется для форми-х рования и анализа проводок, формируемых документом. Для этого у агрегатного объекта Документ существует атрибут Операция, который обеспечивает доступ к операции данного документа. Чтобы документ формировал операцию, необходимо, чтобы в документе стоял флажок Бухгалтерский учет.

Объект Операция также доступен непосредственно в контекстах формы операции, формы журнала операций и формы журнала проводок.

Объект Операция используется для перебора существующих операций и проводок при формировании отчетов и других выборок. В этом случае объект создается при помощи вызова функции СоздатьОбъект ( "Операция" ).

Пример использования операции:

Опер = СоздатьОбъект("Операция");

Опер.ВыбратьОперации(ДатаДок,ДатаДок);

Пока Опер.ПолучитьОперацию() = 1 Цикл Опер.ВыбратьПроводки() ;

Пока Опер.ПолучитьПроводку() = 1 Цикл

Если Опер.Дебет.Счет = СчетПоКоду("62.1") Тогда Сообщить("Субконто " + Опер.Дебет.Клиент);

КонецЕсли;

'g КонецЦикла;

КонецЦикла;

Чтобы проводки не попадали в бухгалтерские итоги, используется метод Отключить Проводки.

Пример перебора проводок в операциях:

Опер = СоздатьОбъект("Операция");

Опер.ВыбратьОперации(ДатаДок,ДатаДок);

, Пока Опер.ПолучитьОперацию() - 1 Цикл Опер.ВыбратьПроводки();

Пока Опер.ПолучитьПроводку() = 1 Цикл

Сообщить("Клиент = " + Опер.Дебет.Клиент +" Счет= " + Опер.Дебет.Счет);

КонецЦикла;

КонецЦикла;

Работа с временными итогами

Чтобы получить итоги на любую дату, нужно выполнять временный (хранящийся только во время существования переменной типа БухгалтерскиеИто-ги) расчет с помощью функции Рассчитать (<ДатаНач>, <ДатаКон>, «Рильтр-ПоСчетам>, <ТолькоСинтетика>, <ПланСчетов>, <РазделительУчета>).

В параметре <ФильтрПоСчетам> можно задать в виде строки список счетов, разделенных запятой или точкой с запятой, по которым будет делаться расчет. Если параметр < ТолькоСинтетика> равен 1, то расчет будет делаться только по счетам, иначе — по счетам и субконто.

Работа с основными итогами

С помощью команды меню Управление бухгалтерскими итогами в системе «1С:Предприятие» устанавливается последний рассчитанный период. В режиме работы с основными итогами осуществляется доступ только к итогам по рассчитанный месяц включительно.

Функции работы с итогами:

• ПериодД (<ДатаНач>, <ДатаКон>) — установка периода итогов;

• СВД (<Счет>, <ТипСуммы>, <Валюта>, <Субконто1>,...) — сальдо начальное дебетовое;

• СНК () — сальдо начальное кредитовое;

• СКД () — сальдо конечное дебетовое;

• СКК () — сальдо конечное кредитовое;

• ДО () — дебетовый оборот по счету за период;

• КО () — кредитовый оборот по счету за период;

• ОБ (<СчетДеб>, < СчетКред>, < ТипСуммы>, <Валюта>) — обороты между счетами.

Параметры: <Счет> — счет, <ТипСуммы>: 1 — сумма, 2 — валютная сумма,

3 — количество, <Валюта> — значение типа "Справочник. Валюты", < Субконто 1 > — значение первого субконто счета, <Субконто2> — значение второго субконто счета и т. д.

Для получения остатков и оборотов по счетам, имеющим субсчета, используются аналогичные функции: СНДР (), СКДР (), СКДР (), СККР ().

Работа с бухгалтерскими итогами в режиме запроса

Для получения большего количества итогов (обороты и остатки по разным видам группировок) используются бухгалтерские запросы.

СОВЕТ Чтобы не разбираться в том, что написано ниже, советую научиться пользоваться конструкторами бухгалтерских запросов, которые вы можете найти в Конфигураторе (Конструкторы • Бухгалтерский запрос).

Перед выполнением запроса следует установить фильтры:

• ВключатьСубсчета () — устанавливать режим отбора по субсчетам;

• Использовать Субконто {<ВидСубконто >, <3начение >, < Тип -

Фильтра>, <ПоГруппам>) — устанавливать режим отбора итогов в разрезе субконто. Параметр <ВидСубконто> задается выражением типа Вид-Субконто или строкой, содержащей имя идентификатора вида субконто. Параметр <3начение> задает конкретное значение субконто. Если <Тип-Фильтра> = 1, тогда итоги будут разворачиваться по этому виду субкон

то. Если <ТипФильтра> = 2, тогда итоги будут отбираться по значению субконто. Если <ТипФильтра> = 3, тогда это субконто вообще не будет

учитываться. Функцию ИспользоватьСубконто можно выполнять несколько раз для задания в запросе нескольких видов субконто. Обращение к субконто производится по порядковому номеру (порядок определяется последовательностью команд ИспользоватьСубконто);

• ИспользоватьКорСубконто{<ВидСубконто>,<3начение>, <Тип-Фильтра>, <ПоГруппам>) — устанавливать режим отбора итогов по корреспондирующим счетам в разрезе субконто.

Затем выполняется сам запрос функцией ВыполнитьЗапрос (<ДатаНач>, <ДатаКон>, <ФильтрПоСчетам>, <ФильтрПоКорСчетам>,<Валюта>, <ТипИтогов>г <Периодичность>, <ТипСуммы>), которая возвращает 1, если запрос выполнился успешно.

Параметр <ТипИтогов> принимает следующие значения:

• 1 — остатки и обороты по счетам,

• 2 — обороты между счетами,

• 3 — и то, и другое.

Параметр <Периодичность> может принимать следующие значения:

• 1 ( " Период " ) — промежуточные итоги не рассчитываются;

• 2 ("Операция") — промежуточные итоги рассчитываются по операциям;

• 3 ("Проводка") — по проводкам;

• 4("День") — по дням;

• 5 ("Неделя") — по неделям;

• 6 ("Декада") — по декадам;

• 7 ("Месяц")— по месяцам;

• 8 ("Квартал") — по кварталам;

• 9 ( " Год " ) — по годам.

Обращение к результатам запроса

Для перебора группировок используются следующие функции:

• ВыбратьСчета () , ПолучитьСчет () ;

• ВыбратьКорСчета () , ПолучитьКорСчет ();

• ВыбратьВалюты () , ПолучитьВалюту () ;

•- ВыбратьПериоды (), ПолучитьПериод ();

• ВыбратьСубконто () , ПолучитьСубконто ();

• ВыбратьКорСубконто () , ПолучитьКорСубконто ().

Функции получения остатков и оборотов такие же, как и при работе с основными итогами.

Примеры использования бухгалтерского запроса

Использование бухгалтерского запроса позволяет выяснить остатки по счетам и получить доступ к операциям.

Первый пример определяет остатки товара на счете 41.1:

Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто("Номенклатура") ; Ит.ВыполнитьЗапрос(Дата1,Дата2,"41.1") ;

Ит.ВыбратьСчета() ;

Пока Ит . ПолучитьСчет ( ) = 1 Цикл Ит.ВыбратьСубконто(1);

Пока Ит.ПолучитьСубконто() = 1 Цикл

Сообщить("Счет " + Ит.Счет.Код + " " + Ит.Субконто(1)

+ Строка(Ит.СКД()));

КонецЦикла;

КонецЦикла;

Второй пример можно использовать для определения документов, которые делали проводки по счету 62.5:

Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,Клиент, 1) ;

Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, ”62.5”,,,

1,"Проводка", ” С ” ) ;

Таб.ВывестиСекцию(”Шапка”);

Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); Ит.ВыбратьСубконто(ВидыСубконто.Контрагенты);

Пока Ит.ПолучитьСубконто(ВидыСубконто.Контрагенты) = 1 Цикл

Таб.ВывестиСекцию("Субконто1") ;

Ит.ВыбратьПериоды();

ДО = 0; КО = 0;

Доку = " ";

Пока Ит.ПолучитьПериод() = 1 Цикл

Опер = Ит.Операция.ТекущийДокумент();

Если Доку = " " Тогда

Доку = Ит.Операция.ТекущийДокумент(); ДО = 0; КО = 0; ИначеЕсли Доку о Опер Тогда

// Секцию следует выводить, только когда меняется документ.

Таб.ВывестиСекцию("Док"); ДО = 0; КО = 0;

Доку = Ит.Операция.ТекущийДокумент() ;

КонецЕсли;

ДО = ДО + Ит.ДО();

КО = КО + Ит.КО();

КонецЦикла;

Таб.ВывестиСекцию("Док");

КонецЦикла;

Схемы переноса информации из одной базы данных в другую

Перенос информации из одной базы данных в другую возможен следующими способами:

• через текстовый файл,

• через файл формата XML,

• при помощи OLE-сервера.

Перенос может отличаться по уровню детализации:

• перенос «документ в документ» — когда структура документа (значения полей, шапка документа и его табличная часть) совпадают;

• перенос сводной информации (когда необязательно переносить всю информацию, а достаточны сводные проводки, например по товарам со ставками НДС 18 и 10%).

Если в процессе переброски документов перенесенные документы не желают проводиться, скорее всего, программа инициализирует не все реквизиты в документе-приемнике, например не заполняет поля фирмы, валюты или курса валюты. Если все поля перенесены корректно, то документы должны проводиться.

Кстати, при переносе расходных накладных следует помнить, что необходимо переносить и справочник Номенклатура, и Контрагенты, а у справочника Номенклатура может быть подчиненный справочник Единицы.

Запись в файл

Самый простой способ записи в файл — вывести текст, который вы хотите сохранить, в поле Окно сообщений, а потом сохранить выведенный текст в текстовом редакторе.

Пример автоматической записи в файл:

Текст = СоздатьОбъект("Текст");

Табз.ВыбратьСтроки();

Пока Табз.ПолучитьСтроку() = 1 Цикл

Текст.ДобавитьСтроку(Табз.Пояснение) ;

Текст.ДобавитьСтроку("");

КонецЦикла;

Текст . Записать ( "_Текст . txt" ) ;

Как модифицировать отчет, чтобы он записывал данные в файл?

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

Список = СоздатьОбъект("СписокЗначений");

Файл = СоздатьОбъект("Текст");

Далее надо найти место в коде, где выводится на печать строка с наименованием товара и количеством (обратите внимание на единицы измерения!), и добавить следующие строки:

Список.УдалитьВсе();

Список.ДобавитьЗначение(Запрос.Товар.Код);

// или Список.ДобавитьЗначение(Запрос.Товар.ПолныйКод());

Список.ДобавитьЗначение(Запрос.Товар.Наименование);

Список.ДобавитьЗначение(Запрос.КонКол);

Файл.ДобавитьСтроку(Список.ВСтрокуСРазделителями());

В конце процедуры следует добавить строку закрытия текстового файла:

Файл.Записать("ИмяФайла");

Как прочитать текстовый файл?

Приведу пример чтения текстового файла, который содержит код товара и его цену:

Список = СоздатьОбъект(мСписокЗначенийм);

Файл = СоздатьОбъектС'Текст");

Файл.Открыть(ИмяФайла);

Тов = СоздатьОбъект("Справочник. Товары”);

Для стр = 1 по Файл.КоличествоСтрок() Цикл Список.УдалитьВсеО;

//Метод ИзСтрокиСРазделителями заполняет список значений из строки.

// Значения в списке разделяются запятыми. Список.ИзСтрокиСРазделителями(Файл.ПолучитьСтроку(стр)); Тов.НайтиПоКоду(Список.ПолучитьЗначение(1));

Если Тов.Выбран() = 0 Тогда продолжить;

КонецЕсли;

Цена = Список.ПолучитьЗначение(2) ;

КонецЦикла;

Некоторые полезные команды типа данных Текст

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

Вот некоторые команды типа данных Текст:

• Открыть (<ИмяФайла>).— открыть файл;

• Код оваяСтраница (<Режим>) — получить/установить режим кодировки; параметр <Режим> принимает значения 0 (Windows-кодировка) и 1 (DOS-кодировка);

• Записать (<ИмяФайла >) — записать текст в файл;

• КоличествоСтрок () — возвращает количество строк в тексте;

• ПолучитьСтроку (<НомерСтроки>) — получить строку текста по номеру;

• Д обавитьСтроку (<Строка >) — добавить строку в конец текста;

• Очистить () — удалить все строки текста;

• Показать {<3аголовок>, <ИмяФайла>) — открыть окно редактирования текста.

Работа с файлами в формате DBF

Для работы с базами данных используется объект типа XBase. Объект XBase предоставляет монопольный доступ к таблицам DBF (то есть файл может быть доступен только одной программе).

Доступ к полям базы данных осуществляется через точку с именем поля. Пример работы с файлом в формате DBF:

БДФ = СоздатьОбъект("XBase”) ;

БДФ.ОткрытьФайл("data.dbf") ;

Если БДФ.Открыта() = 1 Тогда БДФ.Первая();

Пока 1 = 1 Цикл

Сообщить("Запись " + Строка(БДФ.CODE) + " " + БДФ.Name) ;

Если БДФ.Следующая() =0 Тогда Прервать;

КонецЕсли;

КонецЦикла;

ДБФ.ЗакрытьФайл( ) ;

КонецЕсли;

Кстати, может быть, вы не знаете, что файлы в формате DBF можно просматривать в программе Microsoft Excel.

Работа с файловой системой

Для работы с файловой системой используется тип данных ФС.

Вот некоторые функции этого типа данных:

• ВыбратьФайл () — открывает диалог выбора файла,

• ВыбратьКаталог () — открывает диалог выбора каталога,

• СуществуетФайл () — проверяет, существует ли файл с указанным именем,

• КопироватьФайл (),

• УдалитьФайл (),

• ПереименоватьФайл ().

Пример выбора пути к файлу:

Процедура ВыборФайла()

ИмяПути = Константа.ПутьКФайлам;

Если ФС.ВыбратьФайл(0,ИмяФайла, ИмяПути, "Выберите файл загрузки",

"Все файлы(*.*) | *.*",,) = 1 Тогда

ИмяФайла = ИмяПути + ИмяФайла;

КонецЕсли;

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

Перенос данных при помощи XM L-технологии

XML — это язык разметки. С помощью XML создаются древовидная структура хранения данных и правила построения дерева, что уменьшает вероятность ошибок, связанных с доступом к данным.

Смотрите в Интернете статьи, посвященные XML, по следующим ссылкам:

,

,

chin.dataltd.ru/index2.php?id=1c_xml1,

chin.dataltd.ru/index2.php?id=1c_xml2,

chin.dataltd.ru/index2.php?id=1c_xml3.

Работа с внешними программами

Следующий пример показывает, как можно записывать данные в таблицу Excel:

Окно = СоздатьОбъект("Ехсе1.АррНеаНоп”);

Окно.?^іЫе = 1;

Окно.Caption = "Отчет”;

OKHO.Workbooks.Add();

Для п = 1 По 10 Цикл

Ячейка = Окно. Ce 1Е(п, 1) ;

Ячейка/Value = п;

КонецЦикла;

Также вполне возможно, что вам будут полезны следующие команды:

БЕхсе1/ИогкЬоок8.0реп(ИмяФайла);

Окно = BExcel.Worksheets (1); кол = Окно.Rows.Count;

А = Окно.Range(”G5”)-Value;

Б = Окно.Cells(4,8).Value;

Работа с «1С» из «1С» (применение OLE-технологий)

Для запуска системы «1С:Предприятие» в качестве OLE Automation-сервера из внешнего приложения (например, из другой программы «1С») выполняется следующая последовательность действий.

1. Создается объект с OLE-идентификатором:

OLE = СоздатьОбъект(”V77.Application”);

2. Выполняется инициализация системы «1С:Предприятие» методом Initialize:

Рез = OLE.Initialize(OLE.RMTrade,КоманднаяСтрока,””);

Если Рез = 0 тогда

Сообщить(”Не могу открыть базу”) ;

Возврат;

КонецЕсли;

КоманднаяСтрока — это переменная, в которой указывается командная строка запуска «1С:Предприятие». Например:

КоманднаяСтрока = M/DServer\6a3a /^Программист” ;

Это означает, что следует запустить «1С:Предприятие» из каталога \\Server\ база с именем пользователя Программист.

3. Вызываются атрибуты и методы системы «1 С:Предприятие» как OLE Automation-сервера.

Вы можете использовать приведенный ниже пример, чтобы получить доступ к справочнику Контрагенты, который находится в другой базе данных. Если программа не работает, возможно, требуется реиндексировать базу данных, которую вы вызываете, или попробовать зайти в открываемую базу данных под другим именем.

Процедура Сформировать()

OLE = СоздатьОбъект(”V77.Application”) ;

Рез = OLE.Initialize(OLE.RMTrade,””,”NO_SPLASH_SHOW”);

Если Рез = 0 Тогда

Сообщить(”Не могу открыть базу”) ;

Возврат;

КонецЕсли;

Кли1 = OLE.CreateObject("Справочник.Контрагенты");

ЮрЛ1 = OLE.CreateObject("Справочник.ЮрЛица");

Физ1 = OLE.CreateObject("Справочник.ФизЛица");

Кли1.ВыбратьЭлементы();

Пока Кли1.ПолучитьЭлемент() = 1 Цикл Если Кли1.ЭтоГруппа() = 1 Тогда

Продолжить;

КонецЕсли;

Если Кли1.ЮрФизЛицо.Вид() = "ЮрЛица" Тогда ЮрЛ1.НайтиПоКоду(Кли1.ЮрФизЛицо.Код);

ТабзИмяТорг = (лев(сокрлп(ЮрЛ1.Наименование),30)),

Иначе

Физ1.НайтиПоКоду(Кли1.ЮрФизЛицо.Код);

ТабзИмяТорг = (лев(сокрлп(Физ1.Наименование),30))

КонецЕсли;

Сообщить(ТабзИмяТорг);

КонецЦикла;

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

Периодический тип данных



Периодическая величина — это такая величина, которая имеет различное значение в разные дни (то есть имеет значение, связанное с датой). При изменении значения периодического реквизита старое значение сохраняется, при этом новое начинает действовать с указанной даты, а старое — до указанной даты.

К периодическим величинам, например, относится фамилия женщины (в девичестве она имеет одно значение, а после замужества — другое).

Сообщить("Сотрудник " +

Сотрудник.Фамилия.Получить(ДатаДок));

Для работы с периодическими величинами возможна конструкция Использовать Дату ():

Тов =

СоздатьОбъект("Справочник.Номенклатура");

Тов.ИспользоватьДату(ДатаДок);

Тов.ВыбратьЭлементы();

Пока Тов.ПолучитьЭлемент() = 1 Цикл

Сообщить("Ставка НДС " +

Тов.СтавкаНДС);

КонецЦикла;

Удаление элементов объектов

Для удаления объекта (элемента справочника, документа) используется метод Удалить {<Режим>), где параметр <Режим>принимает значения 0 (пометка

Регистры_10Г

на удаление) и 1 (непосредственное удаление, используется по умолчанию). Использовать режим непосредственного удаления объектов не рекомендуется из-за возможного нарушения ссылочной целостности базы данных.

Пример программы удаления документов:

Процедура Удалялки()

Док = СоздатьОбъект("Документ.РасходнаяНакладная");

Док.ВыбратьДокументы();

Пока Док.ПолучитьДокумент() = 1 Цикл

Док.Удалить();

КонецЦикла;

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

Чтобы удалить помеченные на удаление объекты через систему «1 ^Предприятие» 7.7, нужно зайти в программу в монопольном режиме и в меню Операции выбрать пункт Удаление помеченных объектов.

Иногда удаление может быть более сложным, например, когда необходимо удалить группу товаров. В этом случае нужно учитывать подчиненные справочники и следить за тем, чтобы не удалить нужные элементы:

Процедура Удалялки( )

Цена = СоздатьОбъект("Справочник.Цена");

Спр = СоздатьОбъект("Справочник.Номенклатура");

Спр.ИспользоватьРодителя(Группа);

Спр.ВыбратьЭлементы();

Пока Спр.ПолучитьЭлемент() = 1 Цикл

Если Спр.ЭтоГруппа() = 1 Тогда продолжить;

КонецЕсли;

Цена.ИспользоватьВладельца(Спр.ТекущийЭлемент());

Цена.ВыбратьЭлементы();

Пока Цена . ПолучитьЭлемент (.) = 1 Цикл

Цена.Удалить(0);

КонецЦикла;

Спр.Удалить(0);

КонецЦикла ;

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

Работа с транзакциями

Система автоматически использует транзакции при проведении документов. Когда в одной базе данных одновременно работают несколько пользователей, то при записи документа возможна попытка «одновременного» доступа двух документов к базе данных. Поэтому система выполняет проведение документа в режиме транзакции, то есть база данных на время проведения документа становится доступной для записи только одного документа.

Транзакции выполняются системой автоматически и могут быть заданы пользователем. Транзакции, задаваемые пользователем, применяются для выполнения длительных и критических для функционирования системы операций с возможностью отката.

В программе можно начать и зафиксировать транзакцию с помощью следующих функций:

НачатьТранзакцию();

[ОтменитьТранзакциюО ; ]

ЗафиксироватьТранзакцию();

Отмена транзакции отменяет все изменения, внесенные в базу данных с момента начала транзакции.

Регистры

Регистры — это таблицы для накопления оперативных данных и получения сводной информации. Данные в регистры добавляются только при проведении документов. Сведения из регистров используются для формирования отчетов.

Виды регистров

В системе «1С:Предприятие» возможно использование регистров двух типов: регистры остатков ирегистры оборотов. Разница между ними понятна из их названия и заключается в характере хранимой информации: в регистрах остатков всегда хранится информация о конечном состоянии средств, а в регистрах оборотов, образно выражаясь, — как это состояние было достигнуто. Если нужно быстро получать остаток на текущий момент, тогда нужно сделать регистр остатков. Если нужно быстро получать приход или расход за период, тогда нужно сделать оборотный регистр.

Что лучше: бухгалтерские итоги или регистры?

Известный принцип гласит: выигрыш во времени достигается усложнением программирования. Оперативный (регистровый) учет, с точки зрения конечного пользователя, — структура менее гибкая по сравнению с бухгалтерскими итогами, однако она работает быстрее.

При проектировании регистров программист имеет возможность спуститься почти до уровня базы данных. Программист определяет структуру полей регистра и тем самым определяет тип оптимизации — по скорости или по полноте учитываемой информации.

В программах, которые реализуют торговый учет, реализовано два регистра, по принципу скорости и полноты учета:

• быстрый регистр — регистр остатков (5 полей),

• регистр с полной аналитикой — регистр партий (17 полей).

Регистр остатков используют для определения остатков товаров, находящихся на складе, а регистр партий используется для определения сумм себестоимости товара.

Скорость, с которой работает регистр ОстаткиТовара, нельзя получить при помощи регистра Партии или при использовании возможностей бухгалтерского учета.

К недостаткам регистров можно отнести сложность в организации аналитических отчетов. Например, в случае реорганизации регистра (введения или удаления какого-либо измерения) необходимо переработать все программы, использовавшие этот регистр. В то же время после добавления нового счета в бухгалтерском учете его можно сразу же использовать и получать аналитические отчеты при помощи стандартных отчетов.

Бухгалтерские итоги — это, в противоположность регистрам, более гибкая с точки зрения конечного пользователя система. Она реализована при помощи Плана счетов и бухгалтерских проводок и понятна не только программисту, но и бухгалтеру.

Пользователь может сам подстраивать систему бухгалтерских итогов при минимальных вмешательствах со стороны программиста. К недостаткам этого метода учета итогов можно отнести более медленную скорость работы по сравнению с использованием регистров.

Регистры остатков

Регистр остатков позволяет получать следующие виды информации в разрезе определенных измерений:

• начальный остаток,

• приход,

• расход,

• конечный остаток.

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

Например, чтобы рассчитать остатки регистров, которые были до проведения документа Док, следует написать следующий код:

ВремРегистры = СоздатьОбъект("Регистры");

Per = ВремРегистры.ОстаткиТоваров;

Рег.ВременныйРасчет();

ВремРегистры.РассчитатьРегистрыНа(Док.ТекущийДокумент());

ОстатокТовара =

Per.Остаток(ВыбФирма,Товар,Склад,"ОстатокТовара");

С помощью такого кода вы можете в любой момент получить остаток товара на складе.

Для того чтобы определить остатки регистров, которые стали после проведения документа, следует использовать метод РассчитатьРегистрыПо.

Оборотный регистр

Оборотный регистр, в отличие от регистра остатков, выдает итоги за период, определенный для этого регистра. При помощи регистра остатков тоже можно получить итог за период, но для этого нужно будет сконструировать запрос.

Например, для решения описанной ниже задачи проще использовать оборотный регистр, а не регистр остатков.

Требуется предоставлять клиенту скидку в размере 5 %, если оборот клиента за предыдущие 3 месяца превышает 100 000 р.

Сконструируем следующий оборотный регистр с периодичностью месяц: Измерения:

• Клиент (тип значения — справочник Контрагенты),

• Док (тип значения — Документ),

Ресурсы:

• Сумма (тип значения — Число).

Для создания регистра следует зайти в Конфигуратор, выделить мышью узел Регистры, нажать правую кнопку мыши и выбрать в контекстном меню пункт Новый Регистр. Тип регистра (оборотный, остаточный) определяется полем Тип регистра.

Приведенная ниже программа рассчитывает обороты клиента за прошедшие три месяца

// Определение месяца и года Функция м(Дат, г)

Д = Док.ДатаДок;

мес = ДатаМесяц(Д) - 1;

г = ДатаГод(Д);

Если мес < 1 Тогда г = г - 1 ; мес = 12;

КонецЕсли; возврат мес;

КонецФункции

Per = СоздатьОбъект("Регистр.ОборотыКлиента" ) ;

Сум = 0; г = 0 ;

// Определяем итоги за прошлый месяц. мес = м(Док.ДатаДок - 1,г);

Per.ИспользоватьПериод(г,мес);

Сум = Сум + Per.СводныйИтог(Кли,,"Сумма");

// Определяем итоги, которые были два месяца назад. мес = м(Док.ДатаДок - 2,г) ;

Per.ИспользоватьПериод(г,мес);

Сум = Сум + Per.СводныйИтог(Кли,,"Сумма");

// Определяем итоги, которые были три месяца назад, мес = м(Док.ДатаДок - 3,г);

Per.ИспользоватьПериод(г,мес);

Сум = Сум + Per.СводныйИтог(Кли,,"Сумма");

Использование оборотного регистра позволяет быстро получать суммы некоторых движений за определенный период. Такая необходимость может возникнуть, например, если надо очень быстро получить отчет об объемах продаж определенному клиенту за некоторый период времени.

За увеличение скорости обработки, полученное введением оборотных регистров, приходится платить использованием дополнительных дисковых ресурсов.

С точки зрения реализации движений, оборотный регистр аналогичен регистру остатков, а в части итогов объем хранимой информации*зависит от выбранного периода оборотного регистра. В периодах с «дня» до «месяца» объем информации будет пропорционален количеству данных периодов в месяце при постоянном наборе значений. Заметим, что периоды «квартал» и «год» по задействованным ресурсам должны превосходить период «месяц».

Обычно нет необходимости мгновенно получать оборотные итоги, поэтому требуемая информация может быть получена при помощи запроса. Наиболее веским аргументом для создания оборотного регистра может служить необходимость получения оборота при проведении документа или необходимость четко регламентировать отражение некоторых фактов хозяйственной деятельности при проведении документов различных видов.

Многие конфигурации, использующие регистры, построены только на регистрах остатков и не используют оборотных регистров.

Заметим, что при работе с базами данных в формате SQL роль оборотных регистров с точки зрения оптимизации построения отчетов существенно снижается.

Измерения и ресурсы



Основная проблема при проектировании регистров — это определение его структуры.

Структура регистра должна быть такова, чтобы можно было извлекать из него нужную информацию без утомительной обработки.

Измерения регистра — это то, в каких разрезах требуется хранение информации. Ресурсы регистра — это количественные или суммовые данные, которые хранятся в регистре.

Предположим, что регистр ОстаткиТова-ров имеет следующую структуру:

Измерения:

• Товар,

• Склад.

Ресурсы:

• Количество,

• Стоимость.

В идеологии системы «1 (АПредприятие» регистр такого вида представляет собой прямоугольную систему координат, на одной оси которой находятся склады, на другой — товары, а на пересечении конкретного склада и конкретного товара находятся цифры количества товара и его стоимости.

С помощью методов встроенного языка мы можем легко узнать:

• остаток конкретного товара на конкретном складе,

• остаток конкретного товара на всех складах,

• стоимость всех товаров на конкретном складе.

Конструирование регистра

Регистр — это средство для накопления информации. Регистры можно менять только при проведении документов. Регистр содержит измерения, ресурсы и реквизиты.

Состав ресурсов регистра определяется тем, в каких запросах он будет использоваться. Например, если регистр будет использоваться в запросе: «Сколько на заданном складе находится единиц заданного товара по заданной цене», то регистр можно спроектировать следующим образом:

Измерения:

• первое — Склад,

• второе — Товар,

• третье — Цена.

Реквизит:

• Количество.

Для получения сводных остатков используется метод СводныйОстаток. Функции получения остатков или оборотов из регистра предполагают обязательное заполнение полей измерений слева направо. То есть для приведенной выше схемы, если вы не задали Товар, то не можете задать Склад.

То есть такой запрос сформировать нельзя:

Per.СводныйОстаток(Склад,,Цена,"Количество") , а такие запросы составлены верно:

Per.СводныйОстаток(Склад,Товар,,"Количество"),

Per.СводныйОстаток(Склад,,, "Количество"),

При конструировании регистра важно правильно определить порядок измерений. Например, если в будущем должен формироваться такой запрос: «Сколько находится товара у фирмы Б на складе А, товар не важен», то структура регистра будет следующей:

• первое измерение — Фирма,

• второе измерение — Склад,

• третье измерение — Товар.

А для того чтобы формировался такой запрос: «Сколько находится товара А у фирмы Б, склад не важен», структура регистра будет другой:

• первое измерение — Фирма,

• второе измерение — Товар,

• третье измерение — Склад.

Нужно ли предусматривать измерение Фирма при проектировании регистров?

Иногда клиенты говорят: «У нас только одна фирма, и никакую другую мы создавать не намерены». Не верьте сказанному: скорее всего, через некоторое время окажется, что на самом деле работают одновременно две фирмы, например ЧП, работающее на вмененном налоге, и предприятие — плательщик НДС. Так устро-ено законодательство, что с целью минимизации налоговых платежей под крышей одного предприятия собирается несколько индивидуальных предпринимателей. Поэтому следует заранее предусмотреть возможность работы с несколькими фирмами.

Реквизиты регистра

Реквизиты используются для организации фильтров по движениям регистров. Отличие реквизитов от измерений состоит в том, что конечный (начальный) остаток по реквизиту получить нельзя. Остатки можно получать только по измерению.

Приведем пример использования реквизита. Допустим, требуется составить отчет по движению товаров на складах в котором при выбранном складе, обороты, составленные перемещениями (внутренними документами фирмы), не должны учитываться.

Проанализируйте, чем различаются формирования движений регистра Остат-киТМЦ у документов «перемещение» и «реализация» (конфигурации 9.*). Одно из различий движений регистров заключается в том, что перемещение записывает в реквизит Внутреннее единицу, а приходная накладная и реализация — ноль.

Чтобы отделить внутренние перемещения от внешних, достаточно добавить в запрос следующие строки:

|Функция КоличествоПриходВнутр = Приход(Количество) когда (Внутреннее = 1) ;

|Функция КоличествоРасходВнутр = Расход(Количество) когда (Внутреннее = 1) ;

ПРИМЕЧАНИЕ Смотрите отчет Ведомость по остаткам ТМЦ в стандартной конфигурации «Торговли» 9.*.

Запись движения регистров

Вот так может выглядеть процедура записи движений регистров:

Процедура ДвижениеРегистраДолги(Док) Экспорт Per = Док.Регистр.Долги;

Вид = Док.Вид ( ) ;

Если Вид = "ВводОстатковКредита" Тогда Per.Клиент = Док.Клиент;

Per.Агент = Док.Агент;

Рег.Рн = Док.ТекущийДокумент() ;

Per.Сумма = Док.Сумма;

Per.ДвижениеПриходВыполнить() ;

ИначеЕсли Вид = "РасходнаяНакладная" Тогда

Per.Клиент = Док.Клиент;

Per.Агент = Док.Агент;

Per.Рн = Док.ТекущийДокумент() ;

Per.Сумма = Док.Итог("Сумма") + Док . Итог("СуммаНП ") ; Per.ДвижениеПриходВыполнить();

ИначеЕсли Вид = " ПриходныйОрдерТБ" Тогда

Per.Клиент = Док.Клиент;

Per.Агент = Док.Агент;

Рег.Рн = Док.ДокументОснование;

Per.Сумма = Док.Сумма;

Рег.ДвижениеРасходВыполнить();

Иначе

Сообщить("Данный документ не двигает долги");

КонецЕсли;

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

В примере используется регистр Долги. Этот регистр содержит измерения: Клиент, Агент, РасходнаяНакладная — и ресурс Сумма. Регистр предназначен для учета долгов клиентов. Измерение Рн используется для учета погашения конкретного документа.

Данная процедура должна быть расположена в глобальном модуле (об этом свидетельствует строка

Процедура ДвижениеРегистраДолги(Док) Экспорт.

Процедура может вызываться из документов любого вида при их проведении.

Проблемы с регистрами, возникающие у новичков

Перед тем как программировать, попробуйте представить, используете ли вы при постановке задачи следующие термины: начальный остаток, приход,расход, конечный остаток. Если используете, то вам следует искать бухгалтерский счет или регистр, который дал бы нужную вам информацию.

Проблема программистов-новичков заключается в том, что они не понимают, какие задачи следует решать с использованием бухгалтерских итогов (регистров), а какие можно реализовать перебором документов. Так, например, первый отчет по определению просроченной задолженности новичок будет писать без использования регистров. Такая программа очень быстро раздуется и впоследствии будет требовать постоянных доработок. Любое усовершенствование программы будет приводить к ее разрушению. Если программа, которую вы составили, превышает 200 строк, то это может служить поводом задуматься, не пошли ли вы не тем путем.

Попробуем на примерах определить, когда нужно использовать регистры, а когда можно обойтись без них.

Пример 1. Следует спроектировать реестр расходных накладных.

Реестр не требует определения остатков, следовательно, для реализации реестра использовать бухгалтерские счета необязательно.

Пример 2. Требуется определить, сколько кег (возвратной тары) находится у клиента.

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

Поскольку теперь в задании используется термин «конечный остаток», понятно, что следует использовать регистр (бухгалтерский счет), ответственный за хранение кег в разрезе определенного клиента:

СчетКеги {Кеги} {Клиенты}.

Временный расчет регистров

Временный расчет регистров требуется, если нужно получить итоги на определенную дату. Если временный расчет не используется, то итоги регистров выдаются на последний проведенный документ {точку актуальности).

1. Метод РассчитатьРегистрыНа{<7раницаРасчета >, <ГрафаОтбо-ра>) — рассчитать все регистры с установленным флагом временного расчета на начало события (на начало даты или на момент до проведения документа).

2. Метод РассчитатьРегистрыПо{<ГраницаРасчета >, <ГрафаОтбора >) — рассчитать все регистры с установленным флагом временного расчета на конец события (на конец даты или на момент после проведения документа).

Пример иллюстрирует работу временного расчета регистров:

РеР = СоздатьОбъект("Регистр.Резервы") ;

РеР.ВременныйРасчет();

РеР.УстановитьФильтр(Док.Склад,,,);

РассчитатьРегистрыНа(Док.ТекущийДокумент());

Кол =

РеР.СводныйОстаток(Док.Склад/Док.Товар/Док.Партия//"Резерв");

Что такое точка актуальности?



Точка актуальности (ТА) — это запись регистра остатков, которая показывает актуальный (текущий) остаток. Обычно ТА стоит на последнем документе в базе данных. Документ, на котором стоит ТА, подчеркнут красной полосой в журнале документов.

Если требуется определить остатки на ТА, то их можно взять из последней записи. Если же требуется определить остатки не на ТА, то для этого следует определить разницу между ТА и требуемым временем. Для расчета итогов не на ТА используется временный расчет регистров.

Использование метода УстановитьЗначениеФильтра

Метод УстановитьЗначениеФильтра используется для ускорения расчетов. Сравните следующие примеры. Первый работает на 30 % быстрее и выглядит более компактным.

Пример 1:

РегТовары = СоздатьОбъект("Регистр.ОстаткиТоваров") ;

РегТовары.УстановитьЗначениеФильтра("Склад",ТекСклад);

РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон)/

Пока РегТовары.ПолучитьДвижение() = 1 Цикл

Сообщить("Склад = " + РегТовары.Склад + " Остаток = " +РегТовары.ОстатокТовара);

// ...

КонецЦикла;

Пример 2:

РегТовары = СоздатьОбъект("Регистр.ОстаткиТоваров"); РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон) ;

Пока РегТовары.ПолучитьДвижение() = 1 Цикл Если РегТовары.Склад <> ТекСклад Тогда Продолжить;

КонецЕсли;

Сообщить("Склад = " + РегТовары.Склад + " Остаток = " + РегТовары.ОстатокТовара);

// . . .

КонецЦикла;

Использование методов Остаток и СводныйОстаток

Методы Остаток и СводныйОстаток определяют остаток ресурса регистра.

Per = СоздатьОбъект("Регистр.Товары");

Кол1 = Per.Остаток(ВыбФирма,ВыбСклад,ВыбТовар,"Количество");

Кол2 = РегТовары.СводныйОстаток(ВыбФирма,ВыбСклад,,"Количество"); КолЗ = РегТовары.СводныйОстаток(ВыбФирма,, ."Количество");

• Кол1 содержит остаток (количество) товара на выбранной фирме, выбранном складе, по выбранному товару.

• Кол2 содержит остаток (количество) товара на выбранной фирме, выбранном складе, по всем товарам.

• КолЗ содержит остаток (количество) товара на выбранной фирме, на всех складах, по всем товарам.

При использовании метода Остаток должны указываться все измерения регистра (ВыбФирма, ВыбСклад, ВыбТовар, "Количество"), а в случае использования метода СводныйОстаток может быть указана часть измерений:

ОстКол = СводныйОстаток(ВыбФирма,ВыбСклад,,"Количество");

Измерения должны заполняться в том порядке, как они указаны в Конфигураторе. Например, для приведенного выше примера структура регистра следующая:

1) Фирма,

2) Склад,

3) Товар,

то есть следующие записи некорректны:

Кол4 = Рег.СводныйОстаток (ВыбФирма,,ВыбТовар,"Количество") ;

Кол5 = Рег.СводныйОстаток (ВыбФирма,ВыбСклад,ВыбТовар,"Количество");

Колб = Рег.СводныйОстаток (,ВыбСклад,ВыбТовар,"Количество") ;

Использование методов регистров

Для учета себестоимости в конфигурации «Торговля» предусмотрен регистр партий товаров. Для расчета цены себестоимости списываемого товара рассчиты-

Как искать примеры программирования?_HI.

вается остаток товара в количестве и сумме, а затем суммовой остаток товара делится на количественный остаток,

Использования регистра в режиме итогов

Приведенная ниже процедура находится в глобальном модуле конфигурации и вызывается из модуля документа. Процедура определяет сумму себестоимости товара, которую следует списать при проведении расходной накладной.

Процедура ПартииТоваров(Док) Экспорт Per = Док.Регистр.Партии;

Если (Док.Вид() = "РасходнаяНакладная") Тогда Рег_ = СоздатьОбъект("Регистр.Партии");

// Если точка актуальности не на документе,

// то рассчитываются временные итоги регистров.

Если Док.СравнитьТАО = -1 Тогда Рег_.ВременныйРасчет();

Рег_.УстановитьФильтр(Док.Фирма,); РассчитатьРегистрыНа(Док.ТекущийДокумент());

Иначе

Рег_.УстановитьФильтр(Док.Фирма,);

КонецЕсли;

Док.ВыбратьСтроки();

Пока Док.ПолучитьСтроку() - .1 Цикл

// Рассчитываются остатки регистра (количество и сумма)

// для определения себестоимости товара.

остК = Рег_.Остаток(Док.Фирма,Док.Товар,"Количество");

остР = Рег_.Остаток(Док.Фирма,Док.Товар,"Сумма");

// Если количество товара равно нулю, то цена равна нулю. Цена = ?(остК = 0,0,остР/остК);

// Формируются записи в регистр.

Per.Фирма = Док.Фирма;

Per.Товар = Док.Товар;

Per.Количество = Док.Количество*Док.Коэффициент;

Per.Сумма = Док.Количество*Док.Коэффициент*Цена; Per.ДвижениеРасходВыполнить();

КонецЦикла;

КонецЕсли;

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

Прошу обратить внимание, что в данном примере используется регистр партии в двух объектах.

Per — это регистр контекста документа (над ним производится действие Дви-жениеРасходВыполнить), а Рег_ — это регистр, который используется для расчетов итогов (остатка количественного и суммового).

Если вы попробуете перепутать объекты, например выполнить команду

Рег_. ДвижениеРасходВыполнить вместо Per .ДвижениеРасходВыполнить,

то компилятор выдаст ошибку.

Обращение к регистрам через использование запросов

В запросах к регистрам применяются функции НачОст, КонОст, Приход, Расход. В запросах к оборотным регистрам обязательно указывается Период.

Ниже приведен пример запроса для оборотного регистра Доходы. Запрос рассчитывает оборот товара, отгруженного определенному клиенту.

ТекстЗапроса = "

I Период С ДатаНач По ДатаКон/

| Товар = Регистр.Доходы.Товар/

| Клиент = Регистр.Доходы.Клиент/

I Доход = Регистр.Доходы.Доход;

|Условие (Товар = ТекТовар) ;

(Группировка Клиент/

| Функция ПриходПоКлиенту = Приход(Доход)/

Г/

Использование метода ВыбратьДвижения

Метод ВыбратьДвижения инициирует выбор движений регистра за определенный период. Пример показывает, как можно просмотреть движение товаров за период с ДатаНач по ДатаКон:

РегТовары = СоздатьОбъект("Регистр.Товары"); РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон) ;

Пока РегТовары.ПолучитьДвижение() = 1 Цикл

Сообщить("Товар " + РегТовары.Товар + " Стоимость " +

РегТовары.Стоимость)/

КонецЦикла/

Использование метода ВыбратьДвиженияДокумента

Метод ВыбратьДвиженияДокумента инициирует движения регистра по заданному документу. Приведенный ниже пример определяет себестоимость товара, записанного в документе До кум:

РегТов = СоздатьОбъект("Регистр.ПартииТоваров")/ РегТов.ВыбратьДвиженияДокумента(Докум.ТекущийДокумент())/

Пока РегТов.ПолучитьДвижение() > 0 Цикл Стоим = Стоим + РегТов.Стоимость/

КонецЦикла/

Использование метода ПолучитьИтог

Методы ВыбратьИтог и ПолучитьИтог позволяют сделать выборку итогов по регистру. Программа показывает остатки товара:

РегТовары = СоздатьОбъект("Регистр.Товары"); РегТовары.ВыбратьИтоги();

Пока РегТовары.ПолучитьИтог() = 1 Цикл

Сообщить("Товар " + РегТовары.Товар +'

" на складе " + РегТовары.Склад +

" кол-во: " + РегТовары.Количество +

" стоимость: " + РегТовары.Стоимость/

КонецЦикла/

Как искать примеры программирования?

Когда я учился программировать, я прежде всего искал примеры, из которых можно было бы взять нужный мне код. Думаю, что для новичка программирование по шаблонам — наилучший способ программирования и обучения.

Самым большим источником шаблонов является сама «1С». Если посмотреть глобальный модуль, то можно найти огромное количество всевозможных примеров и способов программирования. Единственная трудность заключается в том, как в таком многообразии найти нужный код. Здесь вам может помочь только «гуру». К сожалению, ни один учебник по программированию не способен научить программировать, он может только подсказать, как решить ту или иную задачу. Но в учебнике можно рассмотреть только инструменты, а вот научить их применять может только человек. Поэтому ищите своего «гуру» и учитесь у него, что и когда применять и что в какой последовательности изучать.



Содержание раздела