Имя: Пароль:
1C
1С v8
Проверка документа, помогите!
0 V1rus93
 
01.07.19
21:26
Обычная форма документа. Самописная конфа. Задача такая - Есть документ "Табель смены" в нём две формы (документа и списка) . Хочу, чтобы перед записью документа программа проверяла существует ли этот документ сегодняшней датой. Помогите с модулем. Новичок в программировании 1с. На пальцах понимаю как сделать, а вот правильно написать не знаю как.
1 Beduin
 
01.07.19
21:30
существует ли этот документ
2 V1rus93
 
01.07.19
21:37
Да документ полностью рабочий. Я так понял тут нельзя кидать картинки, мог бы показать. Но процедура следующая. Я открываю документ, получаю форму списка (схожую с обычной "Реализацией товаров и услуг"), нажимаю добавить и выводится форма документа с моими данными. Нужно чтоб после заполнения данных при нажатии "Ок" программа проверяла существует ли уже строка(документ) сегодняшней датой.
3 V1rus93
 
01.07.19
22:23
Вот до чего додумал, но не уверен, что будет работать с нового дня.

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
ДатаДокумента = Ссылка.Дата;
Если ДатаДокумента <> Дата Тогда
    Отказ = Истина;
    Предупреждение("Пользователь уже зарегестрирован сегодня");
    ЭтаФорма.Закрыть();
КонецЕсли;

КонецПроцедуры
4 palsergeich
 
01.07.19
22:26
Это не будет работать.
Используй запрос
5 V1rus93
 
01.07.19
22:30
(4) А можете помочь? Что-то вроде этого запроса?
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    ДатаДокумента = '00010101';

    Если Не ЭтоНовый() Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        | Документ1.Дата
        |ИЗ
        | Документ.Документ1 КАК Документ1
        |ГДЕ
        | Документ1.Ссылка = &Ссылка";

        Запрос.УстановитьПараметр("Ссылка", Ссылка);

        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        
        Если Выборка.Следующий() Тогда
            ДатаДокумента = Выборка.Дата;
        КонецЕсли;
    КонецЕсли;

    Если ДатаДокумента <> Дата Тогда
        Сообщить("Дата изменена");
    КонецЕсли;

КонецПроцедуры
6 palsergeich
 
01.07.19
22:32
(5) Это тоже работать не будет нормально
Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        | Документ1.Дата
        |ИЗ
        | Документ.Документ1 КАК Документ1
        |ГДЕ
        | НачалоПериода(Документ1.Дата, День)= &Дата";
Запрос.УстановитьПараметр("Дата", началоДня(ссыллка.Дата));
7 V1rus93
 
01.07.19
22:33
(6) Понял, сейчас попробую. Спасибо !
8 palsergeich
 
01.07.19
22:34
А если быть совсем перфекционистом то тогда уж
Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
        | Документ1.Дата
        |ИЗ
        | Документ.Документ1 КАК Документ1
        |ГДЕ
        | Документ1.Дата МЕЖДУ &НачалоДня и &КонецДня";
Запрос.УстановитьПараметр("НачалоДня", началоДня(ссыллка.Дата));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ссыллка.Дата));
9 V1rus93
 
01.07.19
22:41
(8) Как-то так вышло
Если Не ЭтоНовый() Тогда
        Запрос = Новый Запрос;
        Запрос.Текст =     
        "ВЫБРАТЬ
         |    ТабельСмены.Дата
         |ИЗ
         |    Документ.ТабельСмены КАК ТабельСмены
         |ГДЕ
         |    ТабельСмены.Дата МЕЖДУ &НачалоДня И &КонецДня";
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Запрос.УстановитьПараметр("НачалоДня", НачалоДня(Ссылка.Дата));
        Запрос.УстановитьПараметр("КонецДня", КонецДня(Ссылка.Дата));
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        
        Если Выборка.Следующий() Тогда
            ДатаДокумента = Выборка.Дата;
        КонецЕсли;
    КонецЕсли;
    
    Если ДатаДокумента <> Дата Тогда
        Отказ = Истина;
        Предупреждение("Пользователь уже зарегестрирован сегодня");
        ЭтаФорма.Модифицированность=Ложь;
        ЭтаФорма.Закрыть();
        
    КонецЕсли;
10 palsergeich
 
01.07.19
22:46
Мне не ясна суть  этого куска

Если Выборка.Следующий() Тогда
            ДатаДокумента = Выборка.Дата;
        КонецЕсли;
    КонецЕсли;
    
    Если ДатаДокумента <> Дата Тогда
11 Exxter
 
01.07.19
22:47
(9) Ссылки нет в запросе) А по дате в выборку попадут все документы с этой датой
12 palsergeich
 
01.07.19
22:49
(11) ну логично, что все, суть проверки понять - этот документ единственный или нет, никто не обещал что я решу это под ключ, направление и смысл я подсказал - дальше сам
13 V1rus93
 
01.07.19
22:51
(12) Да как-то додумаю, спасибо большое !
14 hhhh
 
01.07.19
22:55
(9) если новый тоже надо проверять. Может второй есть документ.
15 V1rus93
 
01.07.19
22:58
(14) По факту я делаю это на случай отключения света например. А так это форма необходима для идентифицированния касира который запустит 1с утром и закроет его вечером закрывая смену.
16 hhhh
 
01.07.19
23:12
(15) тогда к чему проверка на новый? бред какой-то.
17 V1rus93
 
01.07.19
23:26
(16) Дабы избежать повторной регистрации кассира в этот же день. Он зайдет утром, зарегистрируется и на ИнтерфесеКассира будет отображаться чья сегодня смена, а брать программа будет из документа "ТабельСмены" по документу на сегодняшнюю дату.
18 Exxter
 
01.07.19
23:42
(17) Про регистры забыл.
Открыл смену записал, закрыл смену записал, а потом заполнил табель?
19 V1rus93
 
01.07.19
23:45
(18) Табель нужен лишь для того, чтобы отслеживать какой кассир на каком объекте сегодня работает. Так как возможен вариант, что один кассир будет на протяжении недели работать на разных объектах и надо отслеживать эти движения для правильной зарплаты. Но это как я понимаю, я пока помогаю главному программисту.
20 Exxter
 
01.07.19
23:50
(18) Табель - это фактически отработанное время.
21 V1rus93
 
01.07.19
23:55
(20) Выходит так. Я создал документ "ТабельСмены" с реквизитами "Дата", "Сотрудник", "Оклад\Тариф", "Должность", "Объект". При запуске "ИнтерфейсаКассира" вызывается форма документа, кассир его заполняет и это заносится в документ. Проверка нужна для избежания повтора регистрации за один рабочий день и в целом чтоб по 10 раз не указывать кто сегодня работает. Так же на ИнтерфейсеКассира будет отображаться кто работает, а инфа будет тянутся от "ТабеляСмены"
22 Exxter
 
02.07.19
00:00
(21) Запрос с проверкой на дату и сотрудника
23 V1rus93
 
02.07.19
00:04
(22) Да я никак не могу додумать нормально. Как правильно написать, чтоб всё работало.
24 hhhh
 
02.07.19
00:14
(23) При запуске "ИнтерфейсаКассира" просто ищешь документ ТабельСмены, если он есть открываешь его. Если нет создаешь новый и тоже открываешь.
25 Exxter
 
02.07.19
00:14
(23) | Табель.Ссылка
     |ИЗ       
     | Документ.Табель КАК Табель
     |ГДЕ        
     | Табель.Дата = &Дата
     | и Табель.Сотрудник = &Сотрудник"

ЕСЛИ не результат.пустой() тогда
  "Аларм"
Конецесли
26 V1rus93
 
02.07.19
00:27
(25) Видимо я уже сплю, так как не могу догнать. Вот что вышло и не работает Аларм. Просто пропускает это всё.

Запрос = Новый Запрос;
        Запрос.Текст =     
        "ВЫБРАТЬ
        |    ТабельСмены.Дата,
        |    ТабельСмены.Сотрудник
        |ИЗ
        |    Документ.ТабельСмены КАК ТабельСмены
        |ГДЕ
        |    ТабельСмены.Дата = &Дата
        |    И ТабельСмены.Сотрудник = &Сотрудник";
        Запрос.УстановитьПараметр("Дата", (Дата));
        Запрос.УстановитьПараметр("Сотрудник", (Сотрудник));
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
        
    Если Не Результат.Пустой() Тогда
        Отказ = Истина;
        Предупреждение("Пользователь уже зарегестрирован сегодня");
        ЭтаФорма.Модифицированность = Ложь;
        ЭтаФорма.Закрыть();
27 Exxter
 
02.07.19
00:39
(25) 
     Запрос.УстановитьПараметр("Дата", объект.Дата);         Запрос.УстановитьПараметр("Сотрудник",объект.Сотрудник);         Результат = Запрос.Выполнить();        
        Если Не Результат.Пустой() Тогда   
             Отказ = Истина;       
          Предупреждение("Пользователь сегодня");                
        Конецесли;
28 V1rus93
 
02.07.19
00:41
(27) {Документ.ТабельСмены.Форма.ФормаДокумента.Форма(38,42)}: Переменная не определена (объект)
        Запрос.УстановитьПараметр("Сотрудник", <<?>>объект.Сотрудник); Проверка: Толстый клиент (обычное приложение))
Ругается (
29 Exxter
 
02.07.19
00:42
(25) -> (26)
30 palsergeich
 
02.07.19
00:42
Тяжко тебе будет....
31 Exxter
 
02.07.19
00:42
(28) Просто сотрудник
32 V1rus93
 
02.07.19
00:44
(30) Спасибо) Да как-то уже ночь и сегодня целый день подобные задачки решаю.
33 Exxter
 
02.07.19
00:45
Это еще не задачи)
34 V1rus93
 
02.07.19
00:47
(33) Да у меня бывает такое, что всякую фигню не могу решить. А что-то поинтересней выходит. Короче не пашет оно, просто без ошибок спокойно клепает сотрудников. Пробовал одного и того же.
35 V1rus93
 
02.07.19
00:51
(33) Пробил по отладчику и почему-то на месте Отказ = Истина останавливается. Все остальные ловит данные
36 Exxter
 
02.07.19
00:53
(35) В (6) подсказал  обратно даты в началопериода(твоя дата, день) Внимательнее)
37 hhhh
 
02.07.19
00:53
(34) ну вот это

       |    ТабельСмены.Дата = &Дата

хрень какая-то. В 1с дата с секундами, если ты еще не знал. Раньше ты вроде за день проверял, а теперь почему-то одну секунду проверяешь. Почему день выкинул?
38 palsergeich
 
02.07.19
00:54
На дату условие из (8)
39 Exxter
 
02.07.19
01:20
|КонецПериода(ТабельСмены.Дата,день) <= КонецПериода(&Дата,день)
И больше соответственно
40 V1rus93
 
02.07.19
08:16
(39) Серв вчера рухнул, не успел сказать спасибо всем за помощь.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший