Категории каталога
Каталог / Бизнес / Автоматизация предприятий / 1C / Что не следует делать в 1С:Конфигураторе и в 1С:Предприятии 7.7.

Что не следует делать в 1С:Конфигураторе и в 1С:Предприятии 7.7.

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

® Клерк.Ру




Материал предоставлен: Клерк.РУ

Реклама:
Где заказать рерайтинг текстов узнай на сайте eTXT.ru