1. Вступительное слово
Сразу пишу о том, что мне приводилось больше работать с компонентой "Расчет", меньше с "Бухгалтерский учет", вообще не приводилось с "Оперативный учет". Поэтому здесь будет описана работа с первой компонентой, а не по всем сразу. Прошу сразу прощения у поклонников Торговли и Бухгалтерии.
С интеграцией с другими программами я также мало знакома - практически не было практики. В основном я знаю интеграцию работы 1С с 1С, когда нужно было данные из одной конфигурации перенести в другую. 1С с Lotus Notes на нашем предприятии была интеграция, когда нужно было две базы в разных программах поддерживать в актуальном состоянии. Делалось это через коммутатор Lotus Notes. Рассказать более подробно также не могу.SQL я только видела на компьютере у заказчика, созданием новой базы и подключением занимались специальные люди. Я только смотрела через плечо. Поэтому здесь речь будет вестись только чисто по программированию внутри 1С.
2. Что не следует делать в 1С:Конфигурации
2.1. ТекущаяЗапись()
Выдержки из помощника:
- Синтаксис:
- ТекущаяЗапись()
- Назначение:
- Возвращает значение текущей записи журнала расчетов.
- Параметры: Нет.
Эта процедура вовсе не хочет работать в Модуле документа. Ее можно использовать вне контекста захвата Журнала расчета (вне модуля проведения документа, делающего записи в журнал расчетов), то есть в Модуле формы (в модулях документа документов, принадлежащих бухгалтерскому учету и оперативному учету, я не проверяла).
2.2. ВвестиПерерасчет() / ВвестиПерерасчетНаОсновании()
Выдержки из Помощника:
- Синтаксис:
- ВвестиПерерасчет()
- Назначение:
- Вводит перерасчет текущей записи журнала расчетов.
- Возвращаемое значение:
- 1 - если операция успешно выполнена, иљ 0 - в противном случае.
У фирмы 1С в типовой комплексной конфигурации я нашла серьезный "ляп", который пришлось переделывать. Вот следующий код, который записан в модуле документа (в модуле проведения) "Приказ по отпуску". Работает он неправильно:
ЖрнЗарплата.ВыбратьЗаписиПоОбЪекту(Сотрудник,НТП,ЖрнЗарплата.КонецТекущегоПериода());
Пока ЖрнЗарплата.ПолучитьЗапись()=1љ Цикл
Если (ЖрнЗарплата.Перерасчет=0) и
ЖрнЗарплата.Видрасч=ВидРасчета.ПрофВзносы) Тогда
љљљљљљљљљљљ ЖрнЗарплата.ВвестиПерерасчетНаОсновании(Докум)
љљљљљљљљљљљ КонецЕсли;
КонецЦикла;
В итоге не на все записи, на которые было нужно, вводились перерасчеты. Одна или две записи обязательно оказывались пропущенными. При запуске той же процедуры в отладчике "сЪеденные" записи оказывались в журнале. Узнать, в чем здесь ошибка, было практически невозможно, так как отладчик отрабатывал свое, программа свое.
Дело оказалось в следующем:
При создании выборки ("ВыбратьЗаписиПоОбЪекту") в обЪекте "ЖрнЗарплата" типа "ЖурналРасчетов.Зарплата" помещалось определенное количество записей. При вызове процедуры "ВвестиПерерасчетНаОсновании" позиционирование в выборке смещалось вперед, в результате чего некоторые записи в выборке просто-напросто пропускались. Отчего можно сделать вывод, что нельзя совмещать процедуры перебора записей в выборке и внесение изменения в обЪект учета, по которому делалась эта выборка.
Путь решения:
//процедура составления списка записей, по котрым нужно вводить перерасчет
СписокЗаписей=СоздатьОбЪект("СписокЗначений");
ЖрнЗарплата.ВыбратьЗаписиПоОбЪекту(Сотрудник,НТП,ЖрнЗарплата.КонецТекущегоПериода());
Пока ЖрнЗарплата.ПолучитьЗапись()=1љ Цикл
Если (ЖрнЗарплата.Перерасчет=0) и
ЖрнЗарплата.Видрасч=ВидРасчета.ПрофВзносы) Тогда
љљљљљљљљљљљ СписокЗаписей.ДобавитьЗначение(ЖрнЗарплата.ТекущаяЗапись());
КонецЕсли;
КонецЦикла;
//процедура ввода перерасчетов
Для м=1 По СписокЗаписей.РазмерСписка() Цикл
љљљљљљљљљљљ ЖрнЗарплата.НайтиЗапись(СписокЗаписей.ПолучитьЗначение(м));
љљљљљљљљљљљ ЖрнЗарплата.ВвестиПерерасчетНаОсновании(Докум);
КонецЦикла;
Причем здесь есть одно "Но". См. п. 2.1. Метод "ТекущаяЗапись()" не работает в Модуле документа, поэтому процедуру - получение списка записей, по которым нужно ввести перерасчет, следует поместить перед проведением в модуль формы и вызывать ее до момента вызова процедуры "Провести()", переменную "СписокЗаписей" сделать глобальной (то есть, описать в глобальном модуле в признаком "Экспорт"), чтобы в Модуле документа можно было получить к ней доступ. остальное остается без изменений.
2.3. УдалитьЗапись()
-
Выдержки из помощника:
- Синтаксис:
- УдалитьЗапись()
- Назначение:
- Удалить запись журнала расчетов.
- Возвращаемое значение:
- 1 - если операция успешно выполнена, 0 - в противном случае
- Замечание:
- Метод работает только для переменных, созданных функцией СоздатьОбЪект.
Неравильным будет следующий код:
ЖрнЗарплата=СоздатьОбЪект("ЖурналРасчетов.Зарплата");
ЖрнЗарплата.ВыбратьЗаписиПоДокументу(Докум);
Пока ЖрнЗарплата.ПолучитьЗапись()=1 Цикл
љљљљљљљљљљљ ЖрнЗарплата.УдалитьЗапись();
КонецЦикла;
Тут опять же (см. п. 2.2.) совмещены две операции: перебор элементов выборке и удаление записей из нее. Следует разнести эти две процедуры, используя список значений. Секрет ошибки кроется в том, что при удалении записи из выборки, позиция смещается не на предыдущую, а на следующую за удаляемой. При вызове метода "ПолучитьЗапись", позиционирование "прыгает" через одну запись, которую нужно удалить. Получается, что вместо 20 удаляемых записей, удаленных оказывается ровно в два раза меньше, то есть 10.
Решение в следующем коде:
ЖрнЗарплата=СоздатьОбЪект("ЖурналРасчетов.Зарплата");
СписокЗаписей=СоздатьОбЪект("СписокЗначений");
//процедура создания списка удаляемых записей
ЖрнЗарплата.ВыбратьЗаписиПоДокументу(Докум);
Пока ЖрнЗарплата.ПолучитьЗапись()=1 Цикл
љљљљљљљљљљљ СписокЗаписей.ДобавитьЗначение(ЖрнЗарплата.ТекущаяЗапись());
КонецЦикла;
//процедура удаления записей
Для м=1 По СписокЗаписей.РазмерСписка() Цикл
љљљљљљљљљљљ ЖрнЗарплата.НайтиЗапись(СписокЗаписей.ПолучитьЗначение(м));
љљљљљљљљљљљ ЖрнЗарплата.УдалитьЗапись();
КонецЦикла;
2.4. ВвестиРасчет() / ЗаписатьРасчет() / ВвестиРасчетНаОсновании() / ЗаписатьРасчетНаОсновании()
-
Выдержки из помощника:
- Синтаксис:
- ВвестиРасчет(,,,,)
- Назначение:
- Ввести запись в журнал расчетов.
- Параметры:
- - обЪект расчета - элемент справочника, заданного при конфигурировании журнала расчетов.
- - вид вводимого расчета - ссылка на агрегатный обЪект ВидРасчета.
- - дата начала действия вводимого расчета. По умолчанию - дата начала текущего периода журнала расчетов.
- - дата окончания действия вводимого расчета. По умолчанию - дата окончания текущего периода журнала расчетов.
- - результат расчета. По умолчанию - ноль.
- Возвращаемое значение:
- 1 - если операция успешно выполнена, иљ 0 - в противном случае.
Если вы их запишете в Модуле расчета, то глубоко об этом пожалеете. При отмене "рассчитанности" записи в журнале исчезают все записи, которые были введены расчетом, в модуле которого записаны эти(а) процедуры(а).
Поэтому совет: используйте эту процедуру в Модуле документа.
3. Что не следует делать в 1С:Предприятии
3.1. Непосредственное удаление (Сервис -> Параметры -> Закладка "Общие")
Его обычно запрещают в конфигураторе и открывают на этапе отладки ввода данных, чтобы удаление элементов справочника или документов происходило быстрее без входа в монопольный режим и запуска "Удаление помеченных обЪектов". Непосредственное удаление могут делать только опытные пользователи (пишущие программу) и только в том случае, если они уверены, что на удаляемом элементе ничего не завязано (нет на него ссылок из других обЪектов). В конце разработки программы в конфигураторе запрещают выставлять признак "Непосредственное удаление" и это приемлемо везде и считается ошибкой делать иначе.
3.2. Число цифр года (Сервис -> Параметры -> Закладка "Общие") (Совет)
Некоторые пользователи любят выставлять число цифр года в "2", чтобы вместо четырех цифр набирать всего две (быстрее). Я советую ставить число цифр года "4", чтобы не искать документ, записанный на 2000 год (00 год) в документах за 1900 год (тоже 00 год). Иногда 1С понимает набранный год, как 2000, но бывает, что запись года получается в 1900 (обычно за это отвечает "Год начала рабочего столетия" в (Сервис -> Параметры -> Закладка "Общие")). Почему сбивается рабочее столетие, я не знаю. Но все-таки лучше в таких случаях подстраховаться.
Дина Рачевская
www.vesnushka.vov.ru
Dina_Rachevskaya@tut.by
ICQ UIN: 85247474
® Клерк.Ру
Комментарии
6В общем, чувствую, что цикл статей "Заметки ламера" будет продолжаться.