ресурс регистра.
Можно указывать несколько вариантов ОписанияПеременной через запятую.
Дополнительные атрибуты внутренних переменных типа документ:
ТекущийДокумент- ссылка на текущий документ;
НомерДок - номер документа;
ДатаДок - дата документа;
НомерСтроки номер строки документа;
ВремяДок - время документа.
Дополнительные атрибуты внутренних переменных типа справочник:
ТекущийЭлемент ссылка на элемент справочника;
Код - код;
Наименование - наименование
Определение периода выборки.
[Период] С Дата1|ВнешняяПеременная1 [По Дата2|Внешняя переменная2]; Дата1,Дата2 - значение типа "Дата", "Документ" или позиция документа. ВнешняяПеременная1,ВнешняяПеременная2 - внешняя переменная, задающая значение типа "Дата", "Документ" или позиция документа.
Если вторая часть оператора после ключевого слова По пропущена или значение второго параметра команды равно нулю, то интервал времени применяется от начального момента времени до ТА (или по РабочуюДату, если не установлена компонента "Оперативный учет"). Если в описании запроса команда Период С опущена, то интервал дат формирования запроса устанавливается в точку актуальности итогов. Для журнала расчетов конструкция Период С ... По... означает выборку в разрезе расчетных периодов журнала, а конструкция С ... По... означает выборку в разрезе времени действия записей журнала расчетов, определяемых реквизитами журнала "ДатаНачала" и "ДатаОкончания".
Установка фильтров по объектам.
Обрабатывать Все|ПомеченныеНаУдаление|НеПомеченныеНаУдаление;
XI. Основы построения объектов компоненты Расчет 187
ОбрабатыватьДокументы Проведенные|Непроведенные|Все; ОбрабатыватьОперации Включенные|Выключенные|Все;
Вычисление функций и включение их результатов в таблицу выборки. Функции — это вычисляемые поля таблицы выборки. Списки вычисляемых функций различны для различных типов параметров функций.
Функция Имяфункции = Типфункции(Параметр|УточненныйПараметр)
[Когда (Условие)];
ИмяФункции - имя, присваиваемое функции;
Типфункции - ключевое слово одной из встроенных функций языка;
Параметр - имя внутренней переменной, параметр вызова функции;
УточненныйПараметр - конкретизация внутренней переменной, параметр вызова функции.
Условие - условие вычисления функции (необязательно).
Типы встроенных функций:
Сумма - сумма значений параметра;
Среднее - среднее значений параметра;
Минимум - минимальное значение параметра,
Максимум - максимальное значение параметра;
НачОст - начальный остаток значений параметра-ресурса Регистра остатков;
КонОст - конечный остаток значений параметра-ресурса Регистра остатков;
Приход - приход значений параметра-ресурса Регистра остатков;
Расход - расход значений параметра-ресурса Регистра остатков;
Счётчик - количество записей, вошедших в выборку, Параметр - не нужен;
СНД, СКД, СНК, СКК - сальдо начальное или конечное по дебету или кредиту;
ДО, КО, КорДо, КорКо - обороты по дебету или кредиту счета или корсчета;
В функциях; Сумма, Среднее, Максимум, Минимум в качестве аргумента возможно использование
арифметического выражения в терминах встроенного языка.
К параметрам, указывающим на ресурсы Регистров, могут применяться только оговоренные функции.
Поля группировок задают порядок обхода базы данных, а также позволяют записать в таблицу выборки значения необходимых реквизитов переменных запроса, выбранных в качестве полей группировок. Выборка данных из таблицы выборки производится во вложенных циклах по полям группировок. Порядок вложенности циклов должен соответствовать порядку номеров группировок в тексте запроса, как и в бухгалтерском запросе циклы по субконто.
Группировка ИмяГруппировки|ПредопредГруппировка [Упорядочить по
КонкретизацГруппировки, ...][Без Упорядочивания][Без Групп][Все [ВошедшиеВЗапрос]];
ИмяГруппировки - имя внутренней переменной, задающей группировку;
ПредопредГруппировка - ключевое слово одной из встроенных группировок;
КонкретизацГруппировки - конкретизация переменной ИмяГруппировки, задающая порядок групп.
Ключевые слова:
Упорядочить по - параметрами, следующими за данным ключевым словом, могут быть атрибуты и
реквизиты внутренней переменной, задающей группировку. Эти параметры записываются в таблицу
выборки и определяют упорядочивание строк в группировке.
Без Упорядочивания - необязательное добавочное ключевое слово, которое преследует цель
уменьшения времени формирования запроса, при условии, что ни упорядочивание, ни значения
упорядочивания при использовании данного запроса не нужны.
Без Групп - группы справочника не выводятся в запрос (для группировки по справочнику);
Все - в запрос выводятся все значения, и нулевые тоже (используется для группировок по справочникам и временных группировок).
ВошедшиеВЗапрос - уточняет предыдущее ключевое слово 'Все'. Использование данного слова подразумевает, что в каждую строку запроса будут включены значения данных (в том числе нулевые),
для которых есть ненулевое значение хотя бы в одной строке запроса.
188 1С:Предприятие. Практика программирования на платформе \/7
Предопределенные группировки:
Документ - позволяет детализацию до документа;
СтрокаДокумента - позволяет детализацию до строки документа;
ПериодЖурнала - группировка по времени ввода записи журнала расчетов или по времени ее действия. Группировки по дате:
День;
Неделя;
Месяц;
Квартал;
Год.
Для увеличения скорости выполнения запроса, при условии, что итоговые записи при использовании запроса не нужны, можно не накапливать итоги по группировкам.
Метод Без итогов. В случае применения данного оператора в тексте запроса, при обходе результатов запроса применяется только один цикл обхода, используя метод объекта "Запрос" ГруппировкаО без параметра. Если в тексте запроса используется группировка по многоуровневому справочнику и не указано "Без Групп", то итоги по группам справочника будут накапливаться. Другими словами, если в запросе не нужны итоги по группам справочника, то в тексте запроса кроме использования оператора "Без Итогов" дополнительно следует в операторах "Группировка ..." использовать ключевое слово "Без Групп".
Можно назначить условие включения информации в запрос.
Условие(ЛогическоеВыражение);
В логическом выражении могут участвовать внутренние и внешние переменные. Внутренние
переменные ставятся слева от логического оператора, внешние - справа.
Кроме обычных логических операторов (, , =, =, =, о. И, ИЛИ, НЕ) в операторе "Условие ..."
языка запросов можно использовать дополнительный оператор: логический оператор
принадлежности - В
Оператор языка запросов "Условие (А в Б);" говорит о том, что условие истинно, когда значение А
является подмножеством значения Б. Следует особо отметить, что если значение Б пустое (объект не
выбран), то условие является истинным, в отличие от оператора "=" (равно). Если на принадлежность
проверяется значение типа элемент справочника, то проверка выполняется с учетом его возможного
вхождения в группу справочника. Аналогично, проверка на принадлежность субсчета осуществляется с
учетом его возможного вхождения в счет-группу. В качестве включающего подмножества логического
оператора принадлежности (второй параметр после слова "в") может выступать как простое значение,
так и список значений. В этом случае проверка выполняется с учетом вышеотмеченных особенностей для
каждой строки списка значений.
Запрос можно сформировать с помощью конструктора. Войдем в модуль формы документа Амортизация и вызовем конструктор Запрос из меню Конструкторы. Создадим запрос с именем Заполнить.
XI. Основы построения объектов компоненты Расчет 189
Определим период запроса.
Определим переменные запроса: Оборудование и Рез - из журнала расчетов.
190 1С:Предприятие. Практика программирования на платформе у7
Определим Функцию запроса Результат — сумму по переменной запроса Рез.
Определим поле группировки запроса — переменную запроса Оборудование, без упорядочивания и, обязательно, без групп, чтобы группы справочника в выборку не попадали, они в документе не нужны.
Определим условие записи строки выборки.
Определим Функцию запроса Результат — сумму по переменной запроса Рез.
XI. Основы построения объектов компоненты Расчет 191
Определим параметры конструктора запросов.
Отредактируем сформированную конструктором процедуру, используя следующие методы:
Метод Выгрузить(ТаблЗнач,Флаг,Итоги) позволяет выгрузить результаты запроса в таблицу значений. Возвращает число: 1 - если выгрузка произошла успешно, иначе - 0. ТаблЗнач - Таблица значений, куда выгружаются результаты запроса. флаг - необязательный параметр. Число или строка:
Строка - " ТоварО), Товар(2), Товар, Склад, Приход, Расход", где ТоварО) - значение первого упорядочивания группировки "Товар". Итоги - необязательный параметр. Число:
Метод ЗагрузитьТабличнуюЧасть(ТаблЗнач) позволяет загрузить многострочную часть документа из таблицы значений. ТаблЗнач - значение типа "Таблица значений", откуда загружается многострочная часть документа. Колонки совмещаются по идентификаторам.
Процедура Заполнить()
Перем Запрос, ТекстЗапроса, ТаблицаВыборкиЗапроса;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Заполнить)
|Период с (НачМесяца(ДатаДок)) по (КонМесяца(ДатаДок));
192 1С:Предприятие. Практика программирования на платформе V7
|Оборудование = ЖурналРасчетов.Амортизация.Объект;
|Рез = ЖурналРасчетов.Амортизация.Результат;
|Функция Результат = Сумма(Рез);
|Группировка Оборудование без упорядочивания без групп;
|Условие(Рез о 0); |" //}}ЗАПРОС
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат ;
КонецЕсли;
ТаблицаВыборкиЗапроса=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТаблицаВыборкиЗапроса,0,0);
ЗагрузитьТабличнугоЧасть(ТаблицаВыборкиЗапроса);
КонецПроцедуры
Процедуру Заполнить() можно вызвать из процедуры ВодНового().
Упражнение 38. (Необязательное) Создать реквизит документа формы документа Амортизация, графу отбора журналов документов и алгоритм для проверки наличия регламентного документа в периоде расчета, которому принадлежит вводимый документ. Если в указанном периоде уже есть проведенный регламентный документ, то запретить ввод нового документа.
Метод ВыбратьПоЗначению(Дата1,Дата2,ИмяОтбора,Знач)
открывает выборку документов в интервале дат с заданным значением реквизита отбора. Возвращает:
1 - если действие выполнено и в выборке есть хотя бы один документ;
0 - если действие не выполнено или в выборке нет ни одного документа.
Дата1 - дата, документ или позиция начала выборки документов. Если данный параметр опущен, то
выборка начинается с самого первого существующего в системе документа.
Дата2 - дата, документ или позиция конца выборки документов. Если данный параметр опущен, то
выборка заканчивается самым последним существующим в системе документом.
ИмяОтбора - строка с названием Общего реквизита документов либо названием Графы отбора
журналов;
3нач - значение отбора, по которому строится выборка документов.
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.
XI. Основы построения объектов компоненты Расчет 193
Метод ОткрытьФормуМодально(Документ,КонтекстФормы,РежимПросмотра) открывает
визуальную форму существующего документа или элемента/группы справочника.
Возвращает: 1 - если действие выполнено, 0 - иначе.
Документ - выражение со значением типа 'документ' или 'справочник';
Контекстформы - имя переменной, куда можно задать значение любого типа для передачи в
открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.
После исполнения данного метода система вернет в данную переменную контекст открытой формы (необязателен);
РежимПросмотра - необязательный параметр. Числовое выражение: 1 - открыть форму в режиме только просмотра; 0 - открыть форму в режиме редактирования; -1 (минус единица) - в этом случае
используется вариант, предусмотренный текущим значением параметра "Режим открытия объектов",
установленным пользователем интерактивно.
Пока форма открыта, тип значения параметра КонтекстФормы равен 100, когда закрыта - 0.
Примерный текст алгоритма проверки приводится ниже.
Функция ПроверитьРегламент(ДатаД =РабочаяДата()) Экспорт
Док=Создать0бъект("Документ.Амортизация");
ФлагРегламента=О;
Если Док.ВыбратьПоЗначению(НачМесяца(ДатаД),КонМесяца(ДатаД), "Регламент",1) =1 Тогда
Док.ПолучитьДокумент();
Если Док.Проведен()=1 Тогда
Предупреждение("В этом периоде существует регламентный документ!");
ОткрытьФормуМодально(Док,,1);
ФлагРегламента=1;
КонецЕсли;
КонецЕсли;
Возврат ФлагРегламента;
КонецФункции //ПроверитьРегламент
Вызов этой функции Вам предлагается сделать самостоятельно.
Данную проверку целесообразно делать и при проведении документа Амортизация.
Упражнение 39. (Необязательное) Создайте алгоритм, который покажет документы Амортизация, которые надо перепровести, если изменился ТипУчета в проведенном документе Приход. Создайте алгоритм перепроведения этих документов.
Примерный текст алгоритма в глобальном модуле учебного примера приводится ниже.
Перем ПерепровестиДокументы Экспорт;
194 1С:Предприятие. Практика программирования на платформе \/7
II
Процедура Перепровести(Конт) Экспорт
Перем зн,поз,стр;
Если Конт.Проведен()=1 Тогда
СписокДокументов=Создать0бъект("СписокЗначений");
0пер=Создать0бъект("Операция");
Опер.ИспользоватьКорСубконто(ВидыСубконто.Партия, Конт.ТекущийДокумент());
Опер.ВыбратьОперацииСПроводками(Конт.ПолучитьПозицию(),,"ОБ.СП", "ОБ.ПР", 2, );
Пока Опер. ПолучитьПроводку 0=1 Цикл
БДок= Опер.Документ.ТекущийДокумент();
Если (БДок.Вид()="Амортизация") И (СписокДокументов.Принадлежит(БДок)= 0) Тогда
СписокДокументов.ДобавитьЗначение(БДок,БДок.НомерДок);
КонецЕсли;
КонецЦикла;
Рег=Создать0бъект("Регистр.Амортизация");
Peг.УстановитьФильтр(,Конт.ТекудийДокумент());
Peг.ВыбратьДвижения(Конт.ПолучитьПозицию(),,);
Пока Peг.ПолучитьДвижение()=1 Цикл
Док=Рег.ТекущийДокумент();
Если (Док.Вид()="Амортизация") И (СписокДокументов.Принадлежит(Док)=0) Тогда
СписокДокументов.ДобавитьЗначение(Док,Док.НомерДок);
КонецЕсли;
КонецЦикла;
СписокДокументов.Сортировать();
Если СписокДокументов.ОтметитьЗначения (ЗН,"Пометить документы",Поз)=1 Тогда
Для i=l по СписокДокументов.РазмерСписка() Цикл
Если СписокДокументов.Пометка(i)=1 Тогда
XI. Основы построения объектов компоненты Расчет 195
ЗначениеДокумента=СписокДокументов. ПолучитьЗначение(i,Стр);
Если ПерепровестиДокументы. Принадлежит(ЗначениеДокумента)= 0 Тогда
ПерепровестиДокументы.ДобавитьЗначение(ЗначениеДокумента,Стр);
КонецЕсли;
КонецЕсли;
КонецЦикла; // Для
КонецЕсли;
КонецЕсли;
КонецПроцедуры //Перепровести
//
Процедура Перепроведение()
Перем Стр;
Если ПустоеЗначение(ПерепровестиДокументы)=0 Тогда
Док=СоздатьОбъект("Документ.Амортизация");
Для i=1 по ПерепровестиДокументы.РазмерСписка() Цикл
Док.НайтиДокумент(ПерепровестиДокументы. ПолучитьЗначение(i,Стр));
Если Док.Провести()=1 Тогда
Сообщить("Документ "+Док+ " проведен.");
Иначе
Сообщить("Документ "+Док+ " НЕ ПРОВЕДЕН! !!!!!!!!");
КонецЕсли;
КонецЦикла; //ПерепровестиДокументы.РазмерСписка()
КонецЕсли;
КонецПроцедуры //Перепроведение
//
ПерепровестиДокументы=СоздатьОбъект("СписокЗначений");
196 1С:Предприятие. Практика программирования на платформе V7
Упражнение 40. Постройте самостоятельно (Конструктором отчетов) Оборотные ведомости по бухгалтерским итогам, с помощью конструктора бухгалтерских запросов, и по регистру остатков, используя конструктор запросов. Покажите Начальные и конечные остатки (сальдо) и обороты по счету ОБ.ПР и, аналогично, по движениям Приход и Расход регистра остатков.
Вопросы для самоконтроля
Какое основное отличие компоненты Расчет от учетных компонент?
Можно ли включать один и тот же ВидРасчета в записи различных журналов расчета?
Можно ли вести в одном журнале расчета записи по разным объектам
учета?
Атрибуты какого элемента данных непосредственно доступны в модуле расчета?
Можно ли в одном календаре вести индивидуальные графики всех объектов учета?
XII. Связь с другими базами данных 197
XII. Связь с другими базами данных
12.1. Загрузка и выгрузка через текстовый файл с помощью служебного объекта Текст
Текст модуля обработки выгрузки в текстовый файл справочника Оборудование.
Метод ВыбратьФайл(ТипДиалога,ИмяФайла,ИмяНачКаталога,
ЗаголовокОкна,Фильтр,Расширение,Таймаут) открывает окно диалога выбора/сохранения файла.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'. ТипДиалога : 0 - диалог типа открыть, 1 - диалог типа сохранить;
Имяфайла - переменная, содержащая на входе строку с именем файла, а на выходе - имя выбранного файла;
ИмяНачКаталога - переменная, содержащая на входе строку с начальным каталогом, а на выходе -имя выбранного каталога; ЗаголовокОкна - строка с заголовком окна;
фильтр - строка с фильтром отбора файлов (например: 'Все файлы (*.*) [*.*'); Расширение - строка с расширением файла по умолчанию;
Таймаут - время ожидания отклика пользователя в секундах (необязателен).
Процедура Сформировать()
Перем ИмяФайла,ИмяКаталога;
Спр=СоздатьОбъект("Справочник.Оброрудование");
ТекстВыгрузки=Создать0бъект("Текст");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=1 Тогда
ТекстВыгрузки.ДобавитьСтроку("Г"+
Спр.Наименование+"#"+Спр.ГрЦека+"#");
Иначе
ТекстВыгрузки.ДобавитьСтроку(""+Спр.Уровень()+Спр.Наименование+
"#"+Спр.Цена.Получить(РабочаяДата())+"#"+Спр.КоэффАморт+"#");
КонецЕсли;
КонецЦикла;
ФС.ВыбратьФайл(1,ИмяФайла,ИмяКаталога,"Файл выгрузки",
"Файлы выгрузки(*.txt) | *.txt","*.txt") ;
ТекстВыгрузки.Записать(ИмяКаталога+ИмяФайла); КонецПроцедуры
Процедура ПриОткрытии()
198 1С:Предприятие. Практика программирования на платформе V7
Сформировать();
// Чтобы интерактивная форма не открывалась СтатусВозврата(0);
Возврат;
КонецПроцедуры
Текст модуля обработки загрузки из текстового файла. Справочник Загрузка должен иметь реквизиты ГрЦена, Цена, КоэффАморт такие же, как в справочнике Оборудование.
Обратите внимание на алгоритм загрузки элемента справочника в определенную группу (используется переменная модуля Группа) и на алгоритм последовательного обрезания строк текстового файла.
Метод Лев(Строка,Число) возвращает строку, содержащую первые (самые левые) символы текстовой строки.
Строка - строка, содержащая извлекаемые символы;
Число - количество символов, которое должна вернуть функция.
Метод Прав(Строка,Число) возвращает строку, содержащую последние (самые правые) символы текстовой строки.
Строка - строка, содержащая извлекаемые символы;
Число - количество символов, которое должна вернуть функция.
Метод Сред(Строка,Число1,Число2) возвращает подстроку исходной строки, заданную номером позиции и числом символов. Строка - строка, содержащая извлекаемые символы;
Число1 - определяет позицию первого символа, извлекаемого из строки (начиная с 1);
Число2 - количество символов, которое должна вернуть функция (если опущен, то до конца строки).
Метод НаЙти(Строка1,Строка2) возвращает позицию первого вхождения в строку поиска заданной подстроки.
Строка1 - строка в которой ищем (место поиска);
Строка2 - строка которую ищем (шаблон поиска). Если не находит - возвращает число 0. Первая позиция имеет индекс 1.
Метод СтрДлина(Строка) возвращает длину строки.
Строка - строковое выражение.
Метод ИспользоватьДату(Дата,УстСразу) позволяет установить дату выборки периодических реквизитов справочника. Возвращает текущее значение используемой даты (на момент до исполнения метода). Дата - значение типа дата.
УстСразу - необязательный параметр. Число: если 1, то дата, переданная в качестве параметра, будет установлена уже в текущей выборке; если 0 - то дата, переданная в качестве параметра, будет установлена при следующем открытии выборки. Значение по умолчанию - 0.
Если к объекту применен метод ИспользоватьДату, то нельзя применять к этому же объекту метод Получить. Метод нельзя использовать через две точки.
Перем Группа; //__________________________________________________________________________
Функция Проверка(Пар)
Пров=Создать0бъект("Справочник.Загрузка");
Возврат Пров.НайтиПоНаименованию(пар,0,1);
КонецФункции //Проверка //___________________________________________________________________________
XII. Связь с другими базами данных 199
Функция Обрез(С,Ф)
С=Прав (С,СтрДлина (С)-Ф) ;
Ф=Найти(С,"#");
Возврат Лев(С,Ф-1) ;
КонецФункции //Обрез
Процедура Сформировать()
Перем ИмяФайла,ИмяКаталога; спр=СоздатьОбъект("Справочник.Загрузка");
// Назначить дату записи периодических реквизитов
Спр.ИспользоватьДату(РабочаяДата());
ТекстЗагрузки=Создать0бъект("Текст");
ФС.ВыбратьФайл(0,ИмяФайла,ИмяКаталога,"Файл выгрузки",
"Файлы выгрузки(*.txt) | *.txt","*.txt");
ТекстЗагрузки.Открыть(ИмяКаталога+ИмяФайла);
Для н=1 по ТекстЗагрузки.КоличествоСтрок() Цикл
Стр= ТекстЗагрузки.ПолучитьСтроку(Н);
Если Лев(Стр,1)="Г" Тогда
Спр.НоваяГруппа();
Фл=Найти(Стр,"#");
Спр.Наименование=Сред(Стр,2,Фл-2);
Стр=Прав(Стр,СтрДлина(Стр)-Фл);
Фл=Найти(Стр,"#");
Спр.ГрЦена=0брез(Стр,Фл);
Если Проверка(Спр.Наименование)=0 Тогда
Спр.Записать();
КонецЕсли;
Группа=Спр.ТекущийЭлемент();
Иначе
Если Число(Лев(Стр,1))1 Тогда
Спр. ИспользоватьРодителя (Группа);
Иначе
Спр.ИспользоватьРодителя
(ПолучитьПустоеЗначение("Справочник.Загрузка"));
200 1С:Предприятие. Практика программирования на платформе V7
КонецЕсли;
Спр.Новый();
Фл =Найти(Стр,"#");
Спр.Наименование=Сред(Стр,2,Фл-2);
Стр=Прав(Стр,СтрДлина(Стр)-Фл);
Фл=Найти(Стр,"#");
Спр.Цена=Число(Обрез(Стр,Фл));
Спр.КоэффАморт=Число(Обрез(Стр.Фл));
Если Проверка(Спр.Наименование)=0 Тогда
Спр.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПриОткрытии()
Сформировать();
СтатусВозврата(0);
Возврат;
КонецПроцедуры
12.2. Загрузка и выгрузка через файл формата dBase с помощью служебного объекта Xbase
Текст модуля обработки выгрузки в файл справочника Оборудование.
Метод АвтоСохранение(Режим)позволяет установить режим автоматического сохранения изменений в базе. Возвращает текущее числовое значение режима автоматического сохранения изменений в базе (на момент до исполнения метода) Режим - выражение: 1 - задает режим автоматического сохранения изменений в базе, 0 - снимает (по умолчанию - 0)
//**********************************************
Процедура Сформировать()
Перем Имяф,ИмяК;
ДБ=Создать0бъект("XBase");
ДБ.ДобавитьПоле("Соdе" , 2 ,10 ,); //"", 10 ,
ДБ.ДобавитьПоле("Descr",2 , 25 , ) ;
ДБ.ДобавитьПоле("Асс",1,10,2) ;
ДБ.ДобавитьПоле("Gr" , 2 , 2 5 , ) ;
ДБ.ДобавитьПоле("GGr",1,1,0) ;
XII. Связь с другими базами данных 201
ФС.ВыбратьФайл(1,Имяф,ИмяК,
"Сохраните файл","Файл БД (*.dbf) | *.dbf","*.dbf");
ДБ.СоздатьФайл(Имяф,ИмяК);
ДБ.СоздатьИндексныйФайл(Лев(Имяф,СтрДлина(Имяф)-3)+"cdx"); 0б=Создать0бъект("Справочник.Оборудование") ; ДБ.АвтоСохранение(1) ;
Об.ИспользоватьДату(ТекущаяДата());
Об.ВыбратьЭлементы();
Пока Об.ПолучитьЭлемент()=1 Цикл
ДБ.Добавить();
ДБ.Code=06.Koд;
Если Об.ЭтоГруппа()=1 Тогда
ДБ.Асс=0;
ДБ.GGr=i;
ДБ.Descr=06.Наименование+"V";
Иначе
ДБ.Descr=Об.Наименование;
ДБ.Асс=Об.Цена;
ДБ.GGr=0;
Если Об.Уровень()1 Тогда
ДБ.Gr=Oб.Родитель. Наименование+''V" ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Дб.Записать();
//!!!!! Записать последнюю запись
Дб.ЗакрытьФайл();
КонецПроцедуры
Процедура ПриОткрытии()
Сформировать();
СтатусВозврата(0);
Возврат;
КонецПроцедуры
Текст модуля обработки загрузки справочника Оборудование из фйла. Добавляет записи в существующий справочник Оборудование.
202 1С:Предприятие. Практика программирования на платформе V7
Метод Первая() позволяет перейти на первую запись. Возвращает:1 - если действие выполнено; 0 - если действие не выполнено.
Метод Следующая() позволяет перейти на следующую запись. Возвращает: 1 - если получена следующая запись; 0 - иначе.
Перем ДБ,Об;
Процедура ЗаписьЭлемента()
Если ДБ.GGR=1 Тогда
Об.НоваяГруппа(); Об.Наименование=ДБ.DESCR;
ИначеЕсли Дб.GRПолучитьПустоеЗначение() Тогда Об.НайтиПоНаименованию(Дб.GR,0,1); Об.ИспользоватьРодителя(Об.ТекущийЭлемент()); Об.Новый ();
Об.Наименование=ДБ.DESCR; Об.Цена= ДБ.АСС; КонецЕсли; Об.Записать();
КонецПроцедуры //ЗаписьЭлемента //__________________________________________________________________________
Процедура Загрузить()
Перем Имяф,ИмяК;
ДБ=Создать0бъект("XBase");
ФС.ВыбратьФайл(0,Имяф,ИмяК, "Сохраните файл","Файл БД (V*.dbf) | *.dbf");
Дб.ОткрытьФайл(Имяф,Лев(Имяф,СтрДлина(Имяф)-3) +"cdx" , 0) ;
Если Дб.Открыта()=0 Тогда
Предупреждение("База не открыта!"); Возврат;
КонецЕсли;
0б=Создать0бъект("Справочник.Оборудование");
Об.ИспользоватьДату(ТекущаяДата());
Если Дб.Первая()=1 Тогда ЗаписьЭлемента();
Иначе
XII. Связь с другими базами данных 203
Возврат;
КонецЕсли;
Пока Дб.Следующая()=1 Цикл ЗаписьЭлемента();
КонецЦикла;
Дб.ЗакрытьФайл();
ОткрытьФорму("Справочник.Оборудование.ФормаСписка",); КонецПроцедуры Процедура ПриОткрытии()
Загрузить();
СтатусВозврата(0);
Возврат; КонецПроцедуры
204 1С:Предприятие. Практика программирования на платформе V7
Приложение 1. Метод ОткрытьПодбор и предопределенная процедура модуля формы ОбработкаПодбора()
Рассмотрим другой метод заполнения форм объектов на примере заполнения табличной части документа Приход.
Если Вы хотите при открытии формы списка выбирать сразу несколько значений, а не открывать её по каждой строке документа, можно использовать метод ОткрытьПодбор, который открывает форму списка для множественного подбора и передает выбранное значение предопределенной процедуре ОбработкаПодбора().
Метод
ОткрытьПод6ор(Объект,ИмяФормы,Контекстформы,ФлагМножВыбора,ТекЗнач)
открывает форму для подбора значений.
Объект - строка с именем объекта агрегатного типа для подбора. Можно указывать:
"Справочник.ХХХХХ" или "Документ.ХХХХХ" или "Журнал.ХХХХХ" или "Журнал.Подчиненные" или
"ЖурналОпераций.ХХХХХ", "ПланСчетов.ХХХХХ" (если ХХХХХ не задан, то открывается подбор из
любого(всех) плана счетов) или "Отчет.ХХХХХХ' или, "Обработка.ХХХХХХ", где ХХХХХ - имя вида
соответствующего объекта, как он задан в конфигураторе.
Имяформы - строка с именем Формы подбора;
Контекстформы - необязательный параметр. Имя переменной, куда можно задать значение любого
типа для передачи в открываемую форму. Данное знHчение будет доступно в открытой форме как
атрибут Форма.Параметр. После исполнения данного метода система вернет в данную переменную
контекст формы подбора. С помощью значения этого контекста можно затем произвольно
манипулировать формой подбора, пока она открыта. Пока форма открыта, тип значения данного
параметра равен 100 (см. ТипЗначения), если закрыта - 0.
ФлагМножВыбора - число: 1 - выбор нескольких значений; 0 - выбор одного значения, после чего
окно закрывается;
ТекЗнэч - необязательный параметр. В случае выбора из списка, здесь можно передать значение, на
которое следует изначально установить курсор при открытии формы подбора.
Доступ к методу возможен только в контексте Модуля формы.
Предопределенная процедура обработки подбора значения
ОбработкаПодбора(Элемент,КонтФормы)
Элемент - элемент справочника подбора или документ, передаваемый для обработки.
КонтФормы - контекст той формы, из которой шел подбор. Процедура может располагаться только в
программном модуле формы.
//Пример использования метода ОткрытьПодбор в форме документа Приход.
Перем НомСтроки,СписокРасчетов;
Перем СписокРасчетов, НомСтр;
// В шапке модуля
//___________________________________________
Процедура Подбор()
СписокРасчетов=Создать0бъект("СписокЗначений");
Для н=1 по ГруппаРасчетов. ДляОборудования.Количество() Цикл
расч= ГруппаРасчетов. ДляОборудования.ПолучитьРасчет(н);
Приложение 1 205
СписокРасчетов.ДобавитьЗначение(расч, расч.Наименование); КонецЦикла;
ОткрытьПодбор("Справочник.Оборудование", " ДляПодбора " , , 1, ); КонецПроцедуры //Подбор
//
Процедура ОбработкаПодбора(ВыбранноеЗначение)
Перем ЗначениеРасчета, Позиция;
Если ВыбранноеЗначение.Выбран()=1 Тогда
Если ВыбранноеЗначение.Вид()="Оборудование" Тогда
НоваяСтрока();
НомСтр=НомерСтроки; Оборудование=ВыбранноеЗначение;
Контф_мы=ВыбранноеЗначение;
ОткрытьПодбор("Справочник.Единицы","",Контф_мы,0);
Иначе
ПолучитьСтрокуПоНомеру(НомСтр;
Единица=ВыбранноеЗначение;
цена_=Оборудование.Цена.Получить(ДатаДок);
Кол_во=1;
Если ВвестиЧисло(Кол_во,"Введите количество",6,2)=1 Тогда
Количество=Кол_во;
Если ВвестиЧисло(цена_,"Введите цену",10,2)=1 Тогда
НовЦена=цена_;
КонецЕсли;
КонецЕсли;
Сумма=Кол_во*цена_*Единица. Коэффициент;
Если СписокРасчетов.ВыбратьЗначение(ЗначениеРасчета,
"Выберите расчет".Позиция,,0)=1 Тогда
Расчет= ЗначениеРасчета;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
206 1С:Предприятие. Практика программирования на платформе V7
Процедуру Подбор() надо поместить в соответствующую кнопку, аналогично кнопке Печать.В форме списка справочника Единицы надо определить Владельца при её программном открытии методом ОткрытьПодбор("Справочник.Единицы", , Контф_мы, 0). Значение Владельца передается через параметр Контф_мы.
Для этого опишем в модуле формы списка справочника Единицы предопределенную процедуру ПриОткрытии(). Значение параметра формы в открываемой форме списка равно значению Контекста формы (Контфмы), ТипЗначения()=11 — это справочник.
Процедура ПриОткрытии()
Если (ТипЗначения(Форма.Параметр)=11) Тогда
//Для метода ОткрытьПодбор из документа
// Передаём значение типа справочник ИспользоватьВладельца(Форма.Параметр,0);
КонецЕсли;
КонецПроцедуры //ПриОткрытии
Приложение 2 207
Приложение 2. Совокупность основных *.dbf файлов, реализующих хранение
Файлы Назначение
1SUSERS Системный файл: контроль соединений и обновлений информации
пользователями.
1SSYSTEM Системный файл; содержит общие параметры информационной
базы (точку актуальности, рассчётнный период бухгалтерских
итогов, периодичность оперативных итогов и т.д.).
1SCONST Значения констант и периодических реквизитов справочников и
бухгалтерских счетов.
1SJOURN Содержит заголовки всех документов (внутренний идентификатор,
номер, дату, время, общие реквизиты, по которым установлен
отбор)
1SCRDOC Содержит вхождения документов в графы отбора, списки
подчиненных документов, вхождения документов в общие журналы,
для которых определен состав документов.
1SDNLOCK Содержит временный список номеров документов, которые в
данный момент вводятся, для автоматической нумерации
документов с учетом вводимых.
ISUIDCTL Используется для дополнительного контроля уникальности
внутренней идентификации объектов (документов, справочников,
бухгалтерских счетов).
ISBLOB Содержит значения реквизитов справочников, документов, счетов
имеющих тип Строка неограниченной длины. Также содержит
описания шаблонов типовых операций.
SC* Содержит данные справочника конкретного вида. Каждый
справочник хранится в отдельном файле
DT* Содержит данные реквизитов табличной части документа
конкретного вида. Создается при наличии реквизитов реквизитов
табличной.
DH* Содержит данные реквизитов шапки, общих реквизитов без
признака Отбор документа конкретного вида и итоговые суммы
по колонкам тех реквизитов табличной части, для которых
установлен признак "Итог по колонке". Создается при наличии
реквизитов.
RA* Содержит движения регистра конкретного вида.
RG* Содержит итоги регистра конкретного вида (остатки для регистров
остатков, обороты для оборотных регистров).
1SACCS Содержит список бухгалтерских счетов всех планов счетов
1SOPER Содержит данные бухгалтерских операций (сумму, содержание,
доп. реквизиты). Содержит одну строку на каждый документ, по
которому создана операция.
1SENTRY Содержит бухгалтерские проводки
1SBKTTLC Содержит рассчитанные бухгалтерские итоги оборотов между
синтетическими счетами.
1SBKTTL Содержит рассчитанные бухгалтерские итоги остатков и оборотов
208 1С:ПредприяZив. Практика программирования на платформе V7
по синтетическим счетам и объектам аналитики. 1SCORENT Содержит список корректных проводок.
1SACCSEL Содержит вхождения проводок в отборы по бухгалтерским счетам.
1SSRSFT Содержит список вхождений проводок в отборы по субконто
1STOPER Содержит список типовых операций.
CJ* Содержит данные журнала расчетов конкретного вида.
CJPROP Содержит свойства журналов расчетов (расчетный период, глубина
просмотра и т.п.)
CL* Содержит данные календаря конкретного вида.
1SUPDTS Системный файл компоненты Управление распределенными ИБ.
Содержит таблицу регистрации изменений.
1SDWNLD Системный файл компоненты Управление распределенными ИБ.
Содержит таблицу регистрации выгрузок.
1SDBSET Cистемный файл компоненты Управление распределенными ИБ.
Приложение 3 209
Приложение 3. Некоторые ошибки, выдаваемые системой
Возвращаемые коды ошибок:
Код Причина ошибки
-10 Ошибка закрытия файла
-20 Ошибка создания файла
-30 Ошибка определения длины файла
-40 Ошибка установки длины файла
-50 Ошибка при попытке заблокировать файл
-56 Ошибка захвата файла. В течение 60 сек. система не смогла захватить файл.
Машина, на которой запущена система 1C:Предприятие - не база,
перегружена другими задачами.
-60 Ошибка при открытии файла
-70 Ошибка чтения файла
-80 Ошибка удаления файла
-90 Ошибка переименования файла
-100 Ошибка позиционирования в файле
-110 Ошибка снятия блокировки с файла
-120 Ошибка записи в файл
-200 Файл не является базой данных DBF-формата
-210 Неопознанное имя поля
-220 Неопознанный тип поля
-230 Запись слишком длинная
-300 Индексный файл не содержит информации о за-писи
-310 Ссылки в индексном файле или разрушены, или указывают на
несуществующие элементы базы данных
-920 Не достаточно оперативной памяти
210 1С:Предприятие. Практика программирования на платформе V7
ДЛЯ ЗАМЕТОК
Отпечатано в ИПО -Лев Толстой. Зак.304