IX. Автоматична підстановка ціни документа під час вибору номенклатури. Автоматична підстановка ціни в документ при виборі номенклатури Як встановити основну організацію для підстановки в документи

Наше завдання полягає у наступному. Ціна номенклатури у нас тепер зберігається у окремому регістрі відомостей. Коли ми створюємо або змінюємо документ НаданняПослуги та додаємо до табличної частини яку-небудь номенклатуру, нам хочеться, щоб одночасно з цим у документ підставлялася б одразу й актуальна ціна цієї номенклатури, отримана з регістру відомостей та відповідна даті документа.

Для цього нам потрібно зробити дві речі.

Спочатку написати певну функцію, яка повертатиме нам актуальну ціну номенклатури, а потім викликати цю функцію в той момент, коли до документу додається номенклатура, і підставити в документ ціну номенклатури, яку поверне ця функція.

Оскільки такий «сервіс» знадобиться нам, швидше за все, не лише в цьому документі, а й в інших документах, які містять у табличній частині номенклатуру, ми розмістимо функцію у певному загальнодоступному місці – у загальному модулі.

У режимі конфігуратора

Функція, яка повертає ціну номенклатури

Спочатку ми створимо функцію РоздрібнаЦіна(), яка повертатиме нам актуальну роздрібну ціну номенклатури і помістимо її в загальний модуль конфігурації.

Відкриємо конфігуратор, у гілці Загальні Загальні модулі додамо новий об'єкт конфігурації Модуль і назвемо його Робота Довідниками.

Ми бачимо, що у модуля за замовчуванням встановлено прапорець Сервер. Це означає, що екземпляри цього модуля будуть скомпілювати лише на стороні сервера.

Встановимо прапорець Виклик сервера для того, щоб експортні процедури та функції цього модуля можна було викликати з клієнта (рис. 9.9).

Помістимо до нього наступний текст (листинг 9.1).

Пояснимо цю функцію.

Для отримання роздрібної ціни ми передаватимемо у функцію два параметри:

АктуальнаДата - параметр типу Дата, що визначає точку на осі часу, в якій нас цікавить значення роздрібної ціни.

У тілі функції ми спочатку створюємо допоміжний об'єкт Відбір.

Це структура, що містить відбір за вимірами регістру. З його допомогою визначаємо, що нас цікавитимуть записи регістру, в яких вимір регістру Номенклатура дорівнює переданому в функцію посилання на елемент довідника.

Ім'я ключа структури ("Номенклатура") має збігатися з ім'ям вимірювання регістра, заданого в конфігураторі, а значення елемента структури (Елементноменклатури) задає значення, що відбирається за даним вимірюванням.

У другому рядку ми звертаємося до менеджера регістру відомостей Ціни (РегістриДовідок.Ціни) і виконуємо метод ОтриматиОстаннє(), який повертає нам значення ресурсів найпізнішого запису регістру, що відповідає дати (АктуальнаДата), що передається в функцію, і значенням вимірювань регістру (Відбір).

Метод ОтриматиОстаннє повертає структуру, що містить значення ресурсів, яка зберігається в змінній значенняРесурсів. Взагалі кажучи, регістр може мати кілька ресурсів. У нашому регістрі ресурс один, але все одно буде повернуто структуру, що містить єдиний елемент.

Тому в наступному рядку ми отримуємо роздрібну ціну, яку ми шукаємо, просто вказавши ім'я потрібного нам ресурсу регістру через точку (Значення Ресурсів.Ціна) і повертаємо її при виконанні функції.

Тепер цю функцію потрібно викликати у певний момент роботи документа.

Виклик функції при виборі номенклатури та заповнення ціни у документі

Отже, завдання, яке маємо, полягає в наступному. У разі редагування документа НаданняПослуги нам необхідно забезпечити автоматичне заповнення поля Ціна після того, як користувач вибере послугу. Причому ціна послуги повинна визначатися виходячи з дати документа, що створюється.


Знайдемо у конфігураторі документ НаданняПослуги та відкриємо його форму Форма Документу.

Двічі клацніть на елементі форми Перелік Номенклатури Номенклатура або правою кнопкою миші відкриємо для нього палітру властивостей (пункт контекстного меню Властивості). Прокрутивши список до кінця, знайдемо подію Зміни, яка виникає після зміни значення поля.

Натисніть кнопку відкриття зі значком лупи в полі введення.

Система створить шаблон процедури обробника цієї події у модулі нашої форми та відкриє закладку Модуль редактора форми.

Внесемо до нього наступний текст (листинг 9.2).

Прокоментуємо вміст оброблювача.

Перший рядок обробника вам уже знайомий за процедурами Перелік Номенклатури Кількість При Зміні та Перелік Номенклатури Ціна При Зміні. Спочатку ми отримуємо поточний рядок табличної частини документа, оскільки він нам знадобиться надалі, і зберігаємо його в змінній Рядку Таблічної Частини.

Потім ми викликаємо нашу функцію РоздрібнаЦіна() із загального модуля РоботаСодовідниками.

Першим параметром ми передаємо цю функцію дату документа, на яку необхідно отримати ціну. Дату документа ми отримуємо з основного реквізиту форми – Об'єкт.



Функція повертає останнє значення ціни, і це значення ми присвоюємо полю Ціна в поточному рядку табличної частини документа (Рядок Табличної Частини.Ціна).

Зауважте, що сама процедура Перелік Номенклатури Номенклатура При Зміні () починає працювати в модулі форми на стороні клієнта, оскільки це обробник інтерактивної події форми. Створюючи заготівлю цієї процедури, платформа автоматично розмістила перед описом процедури директиву компіляції &Клієнта.

Потім викликається функція Роздрібна ціна (). Оскільки ця функція не буде знайдена на стороні клієнта, виконання буде передано в загальний модуль РоботаСправочниками, який виконується на сервері. Після завершення функції програмний код буде виконуватися на клієнті.

Чому в даному випадку використано таку «хитрість»? Навіщо було передавати виконання коду на сервер?

Справа в тому, що будь-яка робота з базою даних (читання даних, запис) можлива лише на сервері. У разі нам необхідно було прочитати останні дані з регістру відомостей для певної номенклатури.

Такі дії можна виконати тільки на сервері, і якщо подивитися в синтакс-помічнику опис методу ОтриматиОстаннє() регістру відомостей, то можна помітити, що цей метод доступний тільки на сервері, в товстому клієнті та зовнішньому з'єднанні.

Товстий клієнт та зовнішнє з'єднання – це клієнтські програми попередньої версії платформи, які існують для сумісності з колишніми прикладними рішеннями.

Ми ж з вами розробляємо абсолютно нове прикладне рішення, яке працює у тонкому клієнті або у веб-клієнті. Тому в нашому випадку для отримання будь-яких даних з бази даних потрібно передати виконання коду на сервер, отримати потрібні дані і повернути ці дані на клієнта. Що ми зробили.

У режимі 1С: Підприємство

Перевіримо, як працює наш документ.

Запустимо 1С: Підприємство в режимі налагодження та відкриємо регістр відомостей Ціни.

Для транзистора Philips додамо іншим числом нову ціну (рис. 9.10).

Тепер відкриємо документ Надання послуги № 1. Як ви пам'ятаєте, цим документом ми якраз «витратили» такий транзистор.

Залишимо дату документа без зміни та повторимо вибір транзистора в колонці Номенклатура табличної частини документа. Автоматично встановити значення ціни транзистора від 01.07.2009. Це останнє значення ціни на дату документа (рис. 9.11).

Тепер змінимо дату документа на 13.07.2009 та знову повторимо вибір транзистора. Буде встановлено нове значення ціни, останнє на дату (рис. 9.12).

Таким чином, у документі з'являється актуальна на момент створення документа ціна послуги.


Контрольні питання

1. Навіщо призначений об'єкт конфігурації Регістр відомостей.

2. Які особливості має об'єкт конфігурації Регістр відомостей.

3. У чому основні відмінності регістру відомостей від регістру накопичення?

4. Які поля визначають ключ унікальності регістру нагромадження.

5. Що таке періодичний регістр відомостей та що таке незалежний регістр відомостей.

6. Як створити періодичний регістр відомостей.

7. Що таке провідний вимір регістру.

8. Як отримати значення ресурсів пізніших записів регістру засобами вбудованої мови.

Дуже часто, під час роботи у програмі 1С, буває потрібно швидко ввести кілька документів або додати нові об'єкти до довідників (вид номенклатури, організація, склад, каса тощо). При цьому не всі мають розуміння того, як можна автоматизувати введення основних значень, так, щоб при створенні відразу підставлялися в поля потрібні значення. Про те, як це зробити, я розповім у цій статті.
У програмі 1С існують механізми, які дозволяють швидко заповнити значення реквізитів у документах та довідниках. По дії їх можна розділити такі виды:

  • Підстановка єдиного значення
  • Підстановка значення для відбору
  • Заповнення реквізитів за статистикою
  • Підстановка раніше введених реквізитів
  • Підстановка значень шаблону
  • Введення нового документа копіюванням

Підстановка єдиного значення, на який у користувача є права.

Допустимо, у вашій організації є три склади, вони введені в базу. При цьому менеджеру дозволено продавати товар лише з якогось одного. Під час створення нового документа цей склад буде підставлено автоматично. Це працює на основі встановлених прав доступу користувача. Тобто, виключаючи права на об'єкти, з якими користувач не працює, можна автоматизувати введення даних.

Підстановка значення відбору, вказаному у формі списку.

Якщо у списку встановлено відбір за якимось реквізитом (каса, банківський рахунок, склад), цей реквізит буде автоматично заповнений у новому документі. Наприклад, у формі списку документів РКО встановлюєте відбір по касі. При оформленні нового платіжного документа зі списку буде автоматично взято інформацію про вибрану касу. І оскільки для каси вказана організація, то буде автоматично заповнена інформація про організацію. Використовувати відбори можна у будь-якому списку документів.

Заповнення реквізитів зі статистики.

Програма 1С веде статистику введення основних значень щодо кожного користувача. У разі, якщо ви двічі ввели під час створення нового документа однакові організацію, підрозділ, склад, господарську операцію тощо, програма аналізуватиме останні введені значення. Таким чином, алгоритм заповнення за статистикою автоматично підлаштовується під кожного користувача.
Якщо користувач порушує в новому документі цей ланцюжок, то програма це зрозуміє і почне підставляти через деякий час нові значення, але в першому документі значення не будуть підставлені.
Заповнення раніше введених реквізитів при виборі значення іншого реквізиту можливе у разі якщо вибирається, наприклад, торговельну угоду або договір, де заповнені всі основні поля (склад, графік оплати, ціни тощо). При зазначенні угоди чи договору у документі реквізити буде заповнено за такими правилами:

будуть заповнені всі дані, які були визначені в угоді або договорі;

якщо в угоді чи договорі не було зазначено будь-яке значення (наприклад, підрозділ), то це значення буде заповнено відповідно до статистики. Якщо при введенні нового документа значення були заповнені відповідно до статистики, вони будуть перезаповнені, якщо вони визначені в угоді або договорі.

Підстановка значень шаблону.

Зверніть увагу, коли створюється новий вид номенклатури, можна вказати значення за замовчуванням, які будуть підставлятися в нові об'єкти. При оформленні нової позиції номенклатури цього виду ці значення будуть підставлятися автоматично. Ще одним прикладом може бути автоматична підстановка інформації про підрозділ у документ, якщо для користувача, який оформляє документ, визначено інформацію про підрозділ у картці користувача.

Введіть новий документ копіюванням.

Тут усе просто. Якщо користувач вже вводив схожий документ, його можна скопіювати і після цього поправити змінилися дані. Перевірити всі реквізити, приділивши особливу увагу такому реквізиту, як дата.

Ось п'ять основних способів полегшити введення однотипних документів та довідників. Обов'язково використовуйте їх у своїй повсякденній роботі

Як швидко ввести значення реквізитів у 1С?

Запитання: Підстановка коду в полі 1с


Здрастуйте, підкажіть будь ласка, в яке поле потрібно підставити процедуру, яка вважає кількість днів між датами, саму процедуру знайшла, а відповідь на це питання – ні

Є поля - дата заїзду, дата виїзду та поле кількість, куди має потрапляти різниця між першими двома значеннями
в яку подію слід додати процедуру?

Відповідь:У події "Зміни" поля ДатаВизда:

Питання: Не працює автоматична підстановка даних

Відповідь:

Всім дякую за відгуки:
1) 1С:Підприємство 8.3 (8.3.4.437), Бухгалтерія для України: версія 2.0.4.3.
2) Спеціально для nsk1C: "У Вас завжди така звичка дивитися туди, куди Вам не треба, у моєму питанні немає, жодного слова за основну ставку ПДВ - це, по-перше, по-друге, уважно ознайомтеся з указом про заборону продуктів 1С в Україні, а потім вже пишіть свої думки.."

Спасибі, за відповідь, але хотілося б дізнатися точніше, де в коді це виставляється.

Питання: Поле введення та Enter в кінці


Керовані форми, робота у веб-клієнті.
Ситуація: запрограмував сканер на Ф7+штрихкод+ентер. Перебував багато варіантів, але код не встигає зчитувати через "Показати ВведенняЗначення". Пішов від цього варіанта.
2. Створив Форму, у ній полі введення. По Ф7 форма відкривається, код у поле введення потрапляє, ентер, походу, теж натискається (перевіряв у полі текстового документа). Намагаюся відловити подію Закінчення Введення Тексту, але не виходить, т.к. воно відпрацьовує по фізично натиснутому ентер на клаві. Автопідбір - не найкращий для мене варіант, т.к. штрихкод може вводиться вручну і тоді мені милиця якийсь вигадувати треба для обходу маленької засмики між натисканнями.
Покажіть, будь ласка, може їсти легші варіанти?

Відповідь:() форма відкривається, код передається - події не відпрацьовують

Питання: Звіт СКД та табличне поле


Створюю звіт за допомогою СКД. Як мені вивести результат у табличному полі? Не в полі табличного документа, а саме в табличному полі.

Відповідь:Поле табличного документа - це елемент форми (до нього виводяться дані), який належить реквізиту (форми) Табличний документ.
У табличний документ ти пишеш значення, а Поле табличного документа тобі це значення виводить.
Як записати значення?

Питання: Дивно працює фокус на полі


Самописна конфігурація на 1С (8.3.8.2088), керовані форми, інтерфейс таксі.

Вішаю на Полі подію ПриЗміні з наступним кодом:

1C
1 2 3 4 Стандартна Обробка = Брехня; ДаніВибору = Новий СписокЗначень; Дані Вибору. Додати(Об'єкт. Номер) ;

На Закінчення Введення Тексту вішаю код

Все працює, але якось криво.

Фокус елемент отримує але якось на половину, видно на картинці:

Стало після коду:

Тобто зникла жовта рамка та оформлення поля. Працює, але не красиво, око чіпляється.

Відповідь:Якщо коротко, то при зміні номера, з'являється форма літерності, де людина заповнює причину зміни, якщо форму людина просто закриває, то повертається старе значення, і фокус залишається в полі. Може є якісь інші ідеї як це краще зробити?

Запитання: Поле таблиці форми


Доброго дня.
Існує стандартна форма вибору номенклатури (ут11), в якій не відображається найменування, лише артикул!

Пробував повернути стандартні параметри форми - безрезультатно, поле/колонка не відображається.

Конфігуратор:

Біля полів дин. списку варто "Використовувати Завжди".
Навіть налагодження при створенні форми (), а також при відкритті () показує, що

Елементи.СписокРозширенийПошукНоменклатура.ПідпорядкованіЕлементи

є, все в режимі видимості та доступності, ніяких функціональних опцій немає!

Спробував додати своє поле з таким самим шляхом до даних – теж не відображається!
Година вбила, а поле не з'являється. Прохання допомогти

Відповідь:

тоді ой! просто у мене вийшло перетягнути поле найменування в іншу групу і його не стало видно,
і по першій кнопці Ще воно не відновлювалося, був упевнений, що вам допоможе.

Питання: Як при виборі елемента довідника зробити відображення коду, а чи не найменування?


є таб. частина, в ній поле з типом довідникпосилання. як при виборі елемента у цьому полі відобразити код реквізиту, а чи не найменування? (керовані форми)

Відповідь: Tklwegsd,))) Так це саме питання

Повідомлення від polax

Чи не можна просто додати поле Код до таблиці?

Питання: Поле вибору відбору у звіті СКД


Вітаю хлопці, питання постало. Хочу вивести поле вибору відбору у звіті, але щось стопориться в мене ця справа, потрібна ваша порада...

Для поля контрагенти вніс код такий, він робить внутрішній відбір, а як для поля зліва відобразити Порівняння і прив'язати його до Користувачів?

1C
1 2 3 4 5 6 7 8 9 10 11 Процедура КористувачіПриЗміні(Елемент) Експорт Параметр = КомпонувальникНалаштувань. Налаштування. Параметри даних. Знайти ЗначенняПараметра(Новий ПараметрКомпонуванняДаних("Користувачі" ) ) ; Параметр. Значення = Користувачі; Параметр. Використання = Істина; ЕлементОтбору = КомпонувальникНалаштувань. Налаштування. Відбір. Елементи. Додати(Тип ( "ЕлементВідборуКомпонівкиДаних") ) ; ЕлементОтбору. ВидПорівняння = ВидПорівнянняКомпонуванняДаних. Рівно; ЕлементОтбору. ЛевоеЗначення = Новий ПолеКомпонівкиДаних( "ВідповідальнийЗаВідповідьНаЗапит"); ЕлементОтбору. ПравоеЗначення = Користувачі; КінецьПроцедури

Відповідь: Dethmontt, прибираю код, є тільки СКД та поле відборів на формі - порожній звіт.

Додано через 1 годину 50 хвилин
Dethmontt, Розібрався, чому порожній звіт при відборі СКД був, стояла умова в запиті СКД по користувачам - видалив його і все запрацювало. Дякую за підказки)

Запитання: Чи можна змінювати склад полів динамічного списку без коду?


Доброго дня. У мене чиста форма, на ній динамічний список із довільним запитом, де одна таблиця (довідник, вона ж основна таблиця ДС), одне поле Посилання та характеристики.

Поля з характеристиками можна відразу використовувати у відборах, сортуваннях, оформленні та вибирати для угруповання. Все працює. Але просто вибрати як додаткове поле неможливо (щоб він став поруч із посиланням окремим стовпцем). Зрозуміло, що за допомогою коду це все робиться, але невже це не можна зробити без коду?
Купа параметрів компонування даних, які можна розмістити на формі, і немає можливості просто додати поле? Чи я роблю щось не так?

Відповідь:Загалом, як я не крутив колонок через компонувальник даних - додати мені не вдалося (Без коду). Швидше за все це неможливо, тому що за колонки відповідає не реквізит форми дс, а елемент форми, що логічно. Компонувальник рулює даними - елемент форми - відображенням (Колонок у тому числі).
Тобто без програмного збільшення підлеглих елементів елемента форми - змінити їх не вдасться.
Всім дякую.

Питання: Введення на підставі повідомлення поле в ТЧ не заповнене


Колеги хелп Не типове введення виходячи з дока в ЗУП 2.5, повідомлення - полі у ТЧ не заповнено, хоча воно заповнено - тип Дата. Код в Обробці Заповнення.
Якщо через форму перебити реквізит, то проводить...

Відповідь:ОМГ він лаявся на інше поле - просто ця колонка була прихована) вона при заповненні в інтерфейсі копіруться з поля дата початку

Розв'яжемо наступне завдання. Необхідно, щоб при створенні або зміні документа Надання послуги та при додаванні до табличної частини якої-небудь номенклатури послуг одночасно підставлялася б одразу актуальна ціна, отримана з регістру відомостей та відповідна даті документа.

Для цього необхідно:

    написати функцію Роздрібна ціна, яка повертатиме актуальну ціну;

    викликати функцію, коли до документа додаватиметься нова номенклатура.

Оскільки така функція може знадобитися надалі, напишемо її в загальнодоступному місці - в загальному модулі.

1. Створити функцію Роздрібна цінау гілці Загальні – Загальні модулі під назвою РоботаДовідниками. Встановити прапор Виклик сервера(щоб експортні процедури та функції цього модуля можна було б викликати з клієнта) (рис. 71а).

Мал. 71а. Властивості загального модуля

2. Помістіть наступний текст у модуль.

Функція РоздрібнаЦіна(АктуальнаДата,ЕлементНоменклатуриПослуг)Експорт

//Створити допоміжний об'єкт Відбір

Відбір = Новий Структура("НоменклатураПослуг",ЕлементНоменклатуриПослуг);

//Отримати актуальні значення ресурсів регістру

ЗначенняРесурсів=РегістриВідомостей.Ціни.ОтриматиОстаннє(АктуальнаДата,Відбір);

Повернення ЗначенняРесурсів.Ціна;

КінецьФункції

Пояснимо функцію.

Для отримання роздрібної ціни необхідно у функцію передати два параметри:

    АктуальнаДата- Параметр типу Дата, визначає точку на осі часу, в якій нас цікавить значення роздрібної ціни.

Ця структура містить Відбірза вимірами регістру. З його допомогою визначається шуканий вимір регістру Номенклатура Послуг, який дорівнює переданому в функцію посилання на елемент довідника.

Ім'я ключа структури («Н оменклатураПослуг») повинна збігатися з ім'ям виміру регістра, заданого в конфігураторі, а значення елемента структури ( ЕлементНоменклатуриПослуг) задає значення, що відбирається по даному виміру.

У другому рядку йде звернення до менеджера регістру відомостей Ціни ( Регістри Відомостей.) та виконання методу ВиконатиОстаннє(), який повертає значення ресурсів останнього запису регістру, відповідної переданої в функцію дати ( АктуальнаДата) та значенням вимірювань регістру Відбір.

Метод ОтриматиОстаннєповертає структуру, що містить значення ресурсів, яка зберігається у змінній Значенняресурсів.

У наступному рядку отримуємо шукану роздрібну ціну, вказавши ім'я потрібного ресурсу регістру через точку ( Значенняресурсів.Ціна) та повертаємо її при виконанні функції.

Т.о. цю функцію можна викликати у певний час.

Необхідно відкрити Форму документа ВиконанняПослуги(Вона була створена раніше). У Модуль форминеобхідно дописати Процедуру ПриЗміні.

Для цього двічі клацніть елемент форми ПерелікНоменклатуриПослуга (рис. 71б).

Мал. 71б. Елементи документа Виконання послуги

У вікні властивостей у події При зміністворіть обробник події, в яку внесемо наступний текст:

&На Клієнті

Процедура СписокНоменклатуриПослугаПриЗміні(Елемент)

//Отримати наступний рядок табличної частини

РядокТаблічноїЧастини=Елементи.ПерелікНоменклатури.ПоточніДані;

//Встановити ціну

РядокТаблічноїЧасти.Ціна=РоботаСо Довідниками.РоздрібнаЦіна(Об'єкт.Дата,РядокТаблічноїЧасти.Послуга);

КінецьПроцедури

Пояснимо функцію.

Перший рядок вже відомий: спочатку отримуємо поточний рядок табличної частини документа, т.к. вона знадобиться надалі, і збережемо її у змінній РядокТаблічноїЧастини.

Потім викликаємо функцію Роздрібна ціна()із загального модуля РоботаДовідниками.

Першим параметром у функцію передаємо дату документа, яку необхідно отримати ціну. Дату документа одержуємо з основного реквізиту форми – Об'єкт..

Функція повертає останнє значення ціни, і це значення надається полю Ціна в поточному рядку табличної частини документа ( РядокТаблічноїЧастини.Ціна).

Зверніть увагу, що процедура СписокНоменклатуриПослугаПриЗміні()починає працювати у модулі форми за клієнта, т.к. це обробник інтерактивної події форми. Створюючи заготівлю цієї процедури, платформа автоматично розмістить перед описом процедури директиву компіляції. &На Клієнті.

Потім викликаємо функцію Роздрібна ціна(). Т.к. ця функція не буде знайдена на стороні клієнта, то виконання буде передано в загальний модуль РоботаДовідниками, що виконується на сервері. Після завершення функції програмний код буде виконуватися на клієнті.

Перевіримо в роботі виконані вище дії, запустимо програму в режимі 1С: Підприємство. Попрацюємо з розробленою конфігурацією.

ВВЕДЕННЯ ДАНИХ У БД

1. Введіть у програму щонайменше 8 документів Надання послуги.