Что не следует делать в 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

      ® Клерк.Ру



Комментарии

6
  • Хранитель_врат
    Зачем такие статьи писать. Либо вещи общеизвестные для людей работающих с 1С, а для тех кто начинает работать совершенно ненужная
  • Alex33
    Опять подруга за своё ! Толи делать больше нечего... Хотя, может быть, человек учится писать статьи, но зачем брать такую тему как 1С.
    В общем, чувствую, что цикл статей "Заметки ламера" будет продолжаться.
  • Хранитель_врат
    А чего вы хотите от сайта клерков? Для этих самых клерков опусы Дины "откровения гуру". Так что кривиться не надо, вроде есть и профессиональные форумы (в смысле тех, кто пишут конфигурации), не так ли? Хотя, признаюсь, в прошлый раз тоже "негодовал".