1С програмування - документи 2год
Новий документ в системі 1С можна ввести різними методами:
Інтерактивно - цей спосіб можна реалізувати по-різному.
1. Варіант перший. Користувач вибирає Пункт меню Документи і в підміню клацає по назві необхідного документа. Що відбувається далі. Документу присвоюється номер, встановлюються дата, починається обробка операторів предопределеннной процедури модуля форми документа ВводНового (), після чого відкривається екранна форма з викликом процедури відкриття (). Новий документ створюється в пам'яті, а для того, щоб він був записаний в базу, необхідно натиснути кнопку Записати.
2. Різновидом цього варіанта є створення документа з відкритої форми журналу документів. Другий варіант передбачає створення нового документа шляхом копіювання такого ж. При копіюванні документу присвоюється новий номер, а всі реквізити заповнюються даними з скопійованого документа. Ось чому, якщо в процедурі ВводНового () ви заповнюєте деякі реквізити при створенні нового документа, то необхідно на початку цієї процедури задати перевірку факту копіювання, для того, щоб не збити значення реквізитів.
3. При третьому варіанті новий документ створюється на підставі існуючого документа іншого виду. У такій ситуації замість процедури ВводНового () буде викликана процедура ВводНаОснованіі (). У ній потрібно описати, які реквізити нового документа будуть заповнені значеннями з документа-підстави. Природно, що заповнюються реквізити нового документа повинні мати той же тип, що і відповідні реквізити-джерела. Приклад заповнення видаткової накладної на підставі рахунку:
РасчетнийСчет = ДокОсн.РасчетнийСчет;
МестоХраненія = глЗначеніеПоУмолчанію ( "ОсновнойСклад");
Контрагент = ДокОсн.Контрагент;
Договір = ДокОсн.Договор;
ВаріантРасчетаНалогов = ДокОсн.ВаріантРасчетаНалогов;
ДокОсн.ВибратьСтрокі ();
Поки ДокОсн.ПолучітьСтроку () = 1 Цикл
НоваяСтрока ();
Товар = ДокОсн.Товар;
Кількість = ДокОсн.Колічество;
Ціна = ДокОсн.Цена;
Сума = ДокОсн.Сумма;
ПДВ = ДокОсн.НДС;
Всього = ДокОсн.Всего;
При виклику процедури відбувається установка значень деяких полів і прапорців накладної значеннями з рахунку. Спочатку ми заповнили реквізити шапки, а потім організували цикл зчитування рядків табличної частини рахунки операторами ВибратьСтрокі () і ПолучітьСтроку (). В цьому ж циклі на кожен рядок підстави вводиться і заповнюється новий рядок накладної (команда НоваяСтрока ()).
Доступ до реквізитів рахунку здійснюється через змінну ДокОсн, яка є параметром процедури. Як ми пам'ятаємо (див. Опис зумовлених процедур модуля форми документа), в неї передається контекст документа-підстави.
4. Програмний спосіб - для нього в мові 1С передбачені спеціальні команди. Можна при записі видаткової накладної сформувати документ рахунок-фактура:
СФ = СоздатьОб'ект ( "Документ.СчетФактура");
СФ.Новий ();
СФ.ВаріантОтправкі = 1;
СФ.НомерДок = НомерДок; // Рахунок-фактура буде з тим же номером і датою, що і
СФ.ДатаДок = ДатаДок; // накладна. Але так можна і не робити, є ж автонумерация
СФ.Контрагент = Контрагент;
СФ.Грузополучатель = Контрагент;
ВибратьСтрокі ();
Поки ПолучітьСтроку () = 1 Цикл
СФ.НоваяСтрока ();
// Реквізит "Товар" док-та рахунок-фактура має невизначений тип
СФ.НазначітьТіп ( "Товар", "Справочнік.Номенклатура");
СФ.Товар = Товар;
Якщо ПустоеЗначеніе (Товар.СтранаПроісхожденія) = 0 Тоді
// а це звернення до реквізитів довідника "Номенклатура"
СФ.СтранаПроісхожденія = Товар.СтранаПроісхожденія;
СФ.Колічество = Кількість;
СФ.Цена = Ціна;
СФ.Сумма = Сума;
СФ.НДС = ПДВ;
СФ.Всего = Сума + ПДВ;
// Тут накладна стає підставою рахунки-фактури через спеціальний реквізит
СФ.ДокументОснованіе = ТекущійДокумент ();
КонецЦікла;
СФ.Запісать ();
СФ.Провесті (0, "Програмно");
Зверніть увагу, що спочатку створюється документ як об'єкт, а потім вводиться новий документ. Наступні дії схожі на дії при введенні на підставі. Не забудьте, якщо ви створюєте або змінюєте документ програмно, його необхідно записувати. І будь ласка, не намагайтеся використовувати метод Провести () в тілі зумовленої процедури ОбработкаПроведенія () модуля документа!
Оператор Провести () в наведеному вище прикладі виконає проведення документа. При проведенні буде викликана зумовлена процедура ОбработкаПроведенія (). Другим реквізитом передається в обробку проведення значення ( "Програмно"), за яким процедура ОбработкаПроведенія () дізнається про програмному виконанні проведення. Це може бути проста рядок або число, її завдання - тільки позначити факт програмного проведення.
Якщо ви працюєте з уже існуючим документом, то метод Провести () перепроведет документ. А за допомогою методу Проведено () можна дізнатися, проведено чи який-небудь документ:
Якщо Док.Проведен ()> 0 Тоді
Повідомити ( "Документ №" + Док.НомерДок + "проведено");
............... // Якісь дії, які потрібно зробити з проведеним документом
Про створення операцій і проводок при проведенні документів Новомосковськ розділ Операції і проводки глави Бухгалтерія.
При створенні великої кількості документів або для прискорення роботи можна зробити висновок цикл в транзакцію. При цьому реальна запис документів відбудеться тільки по команді ЗафіксіроватьТранзакцію (). На час транзакції блокується для інших користувачів запис і проведення документів.
СпісаніеМатеріалов = СоздатьОб'ект ( "Документ.ТребованіеНакладаная");
НачатьТранзакцію ();
Для Ном = 1 За 100 Цикл
СпісаніеМатеріалов.Новий ();
.....................
// Заповнення реквізитів
СпісаніеМатеріалов.Запісать ();
СпісаніеМатеріалов.Провесті ();
Нагадаю, що зумовлена процедура ОбработкаПроведенія () самостійно відкриває транзакцію для проведення, однак є маленька особливість документа, створеного функцією СоздатьОб'ект (). Справа в тому, що про програмному проведенні створених документів не виконується автоматична попередній запис, і для того, щоб при будь-яких збоях і помилках зберігалася узгодженість даних документа і його рухів (операцій) слід об'єднувати запис і проведення документа в одну транзакцію.
Установка періодичного реквізиту довідника при проведенні документа
Простим прикладом такої дії є установка нового окладу співробітника в довіднику Співробітники при проведенні, наприклад, штатного розкладу.
УстановітьРеквізітСправочніка (Співробітник, "Оклад", НовийОклад, ДатаДок);
При інтерактивному або програмному створенні нового документа йому автоматично присвоюється новий унікальний номер. Його можна отримати або встановити який-небудь інший за допомогою атрибута НомерДок:
Док = СоздатьОб'ект ( "Документ.Счет");
Док.Новий ();
Повідомити ( "Документу був автоматично присвоєно №" + Док.НомерДок);
Док.НомерДок = "000013";
Повідомити ( "Встановлено новий №" + "000013");
Якщо ви використовуєте розподілену базу або бажаєте, щоб документи позначали користувача, який їх створив, корисно користуватися префіксами - одним або двома символами, які підставляються перед власне номером документа, але при цьому "входять" в номер. Не забувайте, що префікс повинен бути строковим ( "СЧ" або "01", або "1"), а у властивостях документа повинен бути встановлений строковий тип номера.
Док = СоздатьОб'ект ( "Документ.Счет");
ПрефДок = Лев (ім'я користувача (), 2);
Док.ПрефіксНомера (ПрефДок + "-");
Док.Новий ();
Цей метод змінює префікс за замовчуванням, або повертає поточне значення префікса, якщо використовувати метод без параметра. А ось інша можливість:
Док = СоздатьОб'ект ( "Документ.Счет");
ПрефДок = Лев (ім'я користувача (), 2);
Док.Новий ();
Док.УстановітьНовийНомер (ПрефДок + "-"); // така нумерація працює дуже коректно
На відміну від попереднього цей метод встановлює (а точніше переустановлює введений за замовчуванням при виконанні методу Новий ()) новий номер із зазначеним префіксом.
Нумератор представляє собою об'єкт метаданих, що описує правила нумерації документів: тип і довжина номера документа, його періодичність, необхідність контролю унікальності. Основне призначення нумератора - забезпечити можливість наскрізної нумерації документів різного виду, для чого таким документам призначається однаковий нумератор.
Періодичність. Цей реквізит встановлює 2 важливі характеристики нумератора: межі контролю унікальності номерів документів і період повторюваності номерів. Якщо включений ознака контролю унікальності номерів (див. Нижче), "Періодичність" встановлює, в яких межах здійснювати цей контроль. Наприклад, якщо встановлено "У межах дня", то унікальність номерів документів буде контролюватися в межах доби: наступної доби номера документів можуть повторюватися. При включеній автоматичної нумерації система буде привласнювати черговий порядковий номер кожного нового документу. Після завершення періоду, встановленого в реквізиті "Періодичність", нумерація документів почнеться з 1.
Довжина. Встановлює максимальну довжину номера документа. Не розмахувати без потреби, "довгий" номер знижує продуктивність роботи.
Тип. Група "Тип" дозволяє вибрати тип значення для номера документа - числовий або текстовий. Вибір текстового типу номера буває корисний, коли використовується складна система нумерації документів, і номер документа може включати, крім цифр, також букви і символи-роздільники.
Контроль унікальності. Якщо ця опція включена, то при введенні нового документа його номер перевіряється на унікальність в межах, встановлених в реквізиті "Періодичність".
Дата створення (або записи) - обов'язковий атрибут будь-якого документа. Через нього можна отримати або призначити дату, з якої буде записаний документ:
Док = СоздатьОб'ект ( "Документ.РасходнаяНакладная");
Док.Новий ();
Якщо Док.ДатаДок = '01 .01.02 'Тоді
. Повідомити ( "З Новим Роком!");
КонецЕсли;
Крім дати, позиція документа позначається часом. З ним можна чинити так:
Годинник = 0;
Хвилини = 0;
Секунди = 0;
Док.ПолучітьВремя (Годинник, Хвилини, Секунди); // Прочитаємо час
Якщо Годинники> 21 Тоді
Попередження ( "Досить працювати ночами!
| Документ буде поміщений в кінець дня ");
Док.АвтоВремяКонецДня (); // документ запишеться на 10 сек пізніше останнього
ІначеЕслі Годинники <8 Тогда
Попередження ( "Ніхто не оцінить!
| Документ буде записаний в початок дня ");
Док.АвтоВремяНачалоДня (); // документ запишеться на 10 сек раніше першого
ІначеЕслі Питання ( "Записати документ з поточним часом?", 4) = 7 Тоді // відповідь "Ні"
ВвестіЧісло (ЧасУст, "Вкажіть годину, з яким буде записаний даний документ", 2,0);
Док.УстановітьВремя (ЧасУст, Хвилини, Секунди); // запишеться з цим часом
Док.АвтоВремяТекущее (); // документ запишеться з поточним часом
У великих багатокористувацьких системах часто виникає ситуації, коли нові документи записуються майже одночасно, всередині однієї секунди. Але все одно не виникає ніяких накладок, тому що документи поділяються всередині секунди за допомогою позиції документа. Вона являє собою спеціальне 32-х символьний вираз, яке можна прочитати за допомогою спеціального методу:
ПозДокумента = Док.ПолучітьПозіцію (); // тільки читання.
Позиція є тільки у записаного документа.
Цей страшний звір - точка актуальності
Точка актуальності (ТА) - це "поточний" момент часу в хронології документів, на який регістри оперативного обліку містять поточні значення своїх ресурсів. Це означає, що коли ви звертаєтеся до регістрів, інформація з них видається саме на момент, куди встановлена точка актуальності. Якщо вам потрібні підсумки на інший момент, повинен запускатися тимчасовий розрахунок. ТА допомагає системі визначити поточний наявність коштів, відповідне, наприклад, реальній кількості товарів на складі. Все документа, проведені до ТА, вважаються вже відбулися господарськими операціями, якщо документ проведено після ТА, він не буде врахований при визначенні залишків регістра. Така ситуація рідкісна, тому що документи оперативного обліку після проведення автоматично встановлюють ТА на час свого проведення (режим управління ТА при проведенні документів налаштовується на закладці Оперативний облік вікна Параметри меню Сервіс режиму 1С: Підприємство).
Програмне управління ТА