1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
store_docs.php
См. документацию.
1<?php
2
10
11IncludeModuleLangFile(__FILE__);
12
14{
15 static $types = [
16 Catalog\StoreDocumentTable::TYPE_ARRIVAL => "CCatalogArrivalDocs",
17 Catalog\StoreDocumentTable::TYPE_STORE_ADJUSTMENT => "CCatalogStoreAdjustmentDocs",
18 Catalog\StoreDocumentTable::TYPE_MOVING => "CCatalogMovingDocs",
19 Catalog\StoreDocumentTable::TYPE_RETURN => "CCatalogReturnsDocs",
20 Catalog\StoreDocumentTable::TYPE_DEDUCT => "CCatalogDeductDocs",
21 Catalog\StoreDocumentTable::TYPE_UNDO_RESERVE => "CCatalogUnReservedDocs",
22 ];
23
24 public const DELETE_CONDUCTED_ERROR = 1;
25 private const STORE_CONTROL_DISABLED_CONDUCT_ERROR = 'store_control_disabled_conduct';
26
27 public const CONDUCTED = 'Y';
28 public const CANCELLED = 'C';
29
35 public static function update($id, $arFields)
36 {
38 global $DB;
39 global $APPLICATION;
41 $id = (int)$id;
42
43 if ($id <= 0)
44 {
45 return false;
46 }
47
48 $oldFields = Catalog\StoreDocumentTable::getById($id)->fetch();
49 if (empty($oldFields))
50 {
51 return false;
52 }
53 $allOldFields = $oldFields;
54
55 $isConducted = $oldFields['STATUS'] === 'Y';
56 $isStatusChangingToUnconducted = isset($arFields['STATUS']) && $arFields['STATUS'] === 'N';
57 if ($isConducted && !$isStatusChangingToUnconducted)
58 {
59 $APPLICATION->ThrowException(GetMessage('CAT_DOC_SAVE_CONDUCTED_DOCUMENT'));
60 return false;
61 }
62
63 foreach (GetModuleEvents("catalog", "OnBeforeDocumentUpdate", true) as $arEvent)
64 {
65 if (ExecuteModuleEventEx($arEvent, array($id, &$arFields)) === false)
66 {
67 return false;
68 }
69 }
70
71 if (array_key_exists('DATE_CREATE',$arFields))
72 {
73 unset($arFields['DATE_CREATE']);
74 }
75 if (array_key_exists('DATE_MODIFY', $arFields))
76 {
77 unset($arFields['DATE_MODIFY']);
78 }
79 if (array_key_exists('DATE_STATUS', $arFields))
80 {
81 unset($arFields['DATE_STATUS']);
82 }
83 if (array_key_exists('CREATED_BY', $arFields))
84 {
85 unset($arFields['CREATED_BY']);
86 }
87 if (array_key_exists('DOC_TYPE', $arFields))
88 {
89 unset($arFields['DOC_TYPE']);
90 }
91 if (array_key_exists('ID', $arFields))
92 {
93 unset($arFields['ID']);
94 }
95
96 $arFields['~DATE_MODIFY'] = $DB->GetNowFunction();
97
98 if (!static::checkFields('UPDATE', $arFields))
99 {
100 return false;
101 }
102
103 if (!static::checkRequiredFields($arFields, $oldFields['DOC_TYPE']))
104 {
105 return false;
106 }
107
108 $oldFields = array_intersect_key($oldFields, $arFields);
109
110 $strUpdate = $DB->PrepareUpdate("b_catalog_store_docs", $arFields);
111
112 if(!empty($strUpdate))
113 {
114 $strSql = "update b_catalog_store_docs set ".$strUpdate." where ID = ".$id;
115 if(!$DB->Query($strSql, true))
116 return false;
117
118 if(isset($arFields["ELEMENT"]))
119 {
120 foreach($arFields["ELEMENT"] as $arElement)
121 {
122 if(is_array($arElement))
123 CCatalogStoreDocsElement::update($arElement["ID"], $arElement);
124 }
125 }
126
127 foreach(GetModuleEvents("catalog", "OnDocumentUpdate", true) as $arEvent)
128 ExecuteModuleEventEx($arEvent, array($id, $arFields, $oldFields));
129 }
130
131 if (isset($arFields['DOCUMENT_FILES']) && is_array($arFields['DOCUMENT_FILES']))
132 {
133 static::saveFiles($id, $arFields['DOCUMENT_FILES']);
134 }
135
136 $typeTableClass = Catalog\Document\StoreDocumentTableManager::getTableClassByType($allOldFields['DOC_TYPE']);
137 if ($typeTableClass)
138 {
139 $USER_FIELD_MANAGER->Update($typeTableClass::getUfId(), $id, $arFields);
140 }
141
142 $item = [
143 'id' => $id,
144 'data' => [
145 'fields' => $arFields,
146 'oldFields' => $allOldFields,
147 ],
148 ];
149
150 PullManager::getInstance()->sendDocumentsUpdatedEvent(
151 [
152 $item,
153 ]
154 );
155
156 return true;
157 }
158
159 protected static function saveFiles(int $documentId, array $files)
160 {
161 if (empty($files))
162 {
163 return;
164 }
165
166 // load current file list
167 $existingFiles = [];
168 $fileMap = [];
170 'select' => [
171 'ID',
172 'FILE_ID',
173 ],
174 'filter' => [
175 '=DOCUMENT_ID' => $documentId,
176 ],
177 ]);
178 while ($row = $iterator->fetch())
179 {
180 $id = (int)$row['ID'];
181 $fileId = (int)$row['FILE_ID'];
182 $existingFiles[$id] = [
183 'ID' => $id,
184 'FILE_ID' => $fileId,
185 ];
186 $fileMap[$fileId] = $id;
187 }
188 unset($iterator, $row);
189
190 // convert the new list of files to array format for each line if needed
191 $files = static::convertFileList($fileMap, $files);
192 if (empty($files))
193 {
194 return;
195 }
196
197 // checking that the passed set of document files is full
198 foreach (array_keys($existingFiles) as $rowId)
199 {
200 if (!isset($files[$rowId]))
201 {
202 $files[$rowId] = $existingFiles[$rowId];
203 }
204 }
205
206 // process file list
207 $parsed = [];
208 foreach ($files as $rowId => $row)
209 {
210 // replace or delete existing file
211 if (
212 is_int($rowId)
213 && is_array($row)
214 && isset($existingFiles[$rowId])
215 )
216 {
217 // delete file
218 if (
219 isset($row['DEL'])
220 && $row['DEL'] === 'Y'
221 )
222 {
223 $resultInternal = Catalog\StoreDocumentFileTable::delete($rowId);
224 if ($resultInternal->isSuccess())
225 {
226 CFile::Delete($existingFiles[$rowId]['FILE_ID']);
227 }
228 }
229 // replace file
230 elseif (
231 isset($row['FILE_ID'])
232 )
233 {
234 if ($row['FILE_ID'] !== $existingFiles[$rowId]['FILE_ID'])
235 {
237 $rowId,
238 [
239 'FILE_ID' => $row['FILE_ID'],
240 ]
241 );
242 if ($resultInternal->isSuccess())
243 {
244 CFile::Delete($existingFiles[$rowId]['FILE_ID']);
245 }
246 }
247 }
248 }
249 // save new file
250 elseif (
251 preg_match('/^n[0-9]+$/', $rowId, $parsed)
252 && is_array($row)
253 )
254 {
255 // file already saved from external code
256 if (isset($row['FILE_ID']))
257 {
258 $resultInternal = Catalog\StoreDocumentFileTable::add([
259 'DOCUMENT_ID' => $documentId,
260 'FILE_ID' => $row['FILE_ID'],
261 ]);
262 if ($resultInternal->isSuccess())
263 {
264 $id = (int)$resultInternal->getId();
265 $fileMap[$row['FILE_ID']] = $id;
266 $existingFiles[$id] = [
267 'ID' => $id,
268 'FILE_ID' => $row['FILE_ID'],
269 ];
270 }
271 }
272 // save uploaded file
273 elseif (
274 isset($row['FILE_UPLOAD'])
275 && is_array($row['FILE_UPLOAD'])
276 )
277 {
278 $row['FILE_UPLOAD']['MODULE_ID'] = 'catalog';
279 $fileId = (int)CFile::SaveFile(
280 $row['FILE_UPLOAD'],
281 'catalog',
282 false,
283 true
284 );
285 if ($fileId > 0)
286 {
287 $resultInternal = Catalog\StoreDocumentFileTable::add([
288 'DOCUMENT_ID' => $documentId,
289 'FILE_ID' => $fileId,
290 ]);
291 if ($resultInternal->isSuccess())
292 {
293 $id = (int)$resultInternal->getId();
294 $fileMap[$fileId] = $id;
295 $existingFiles[$id] = [
296 'ID' => $id,
297 'FILE_ID' => $fileId,
298 ];
299 }
300 }
301 }
302 }
303 }
304 }
305
306 protected static function convertFileList(array $fileMap, array $files): array
307 {
308 $formatArray = false;
309 $formatOther = false;
310 foreach ($files as $value)
311 {
312 if (is_array($value))
313 {
314 $formatArray = true;
315 }
316 else
317 {
318 $formatOther = true;
319 }
320 }
321 unset($value);
322
323 if ($formatArray && $formatOther)
324 {
325 return [];
326 }
327
328 if ($formatArray)
329 {
330 return $files;
331 }
332
333 $counter = 0;
334 $list = array_values(array_unique($files));
335 $files = [];
336 $parsed = [];
337 foreach ($list as $value)
338 {
339 if (!is_string($value))
340 {
341 continue;
342 }
343 if (preg_match('/^delete([0-9]+)$/', $value, $parsed))
344 {
345 $value = (int)$parsed[1];
346 if (isset($fileMap[$value]))
347 {
348 $id = $fileMap[$value];
349 $files[$id] = [
350 'DEL' => 'Y',
351 ];
352 }
353 }
354 elseif (preg_match('/^[0-9]+$/', $value, $parsed))
355 {
356 $value = (int)$value;
357 if (isset($fileMap[$value]))
358 {
359 $id = $fileMap[$value];
360 $files[$id] = [
361 'ID' => $id,
362 'FILE_ID' => $value,
363 ];
364 }
365 else
366 {
367 $id = 'n' . $counter;
368 $counter++;
369 $files[$id] = [
370 'ID' => null,
371 'FILE_ID' => $value,
372 ];
373 }
374 }
375 }
376 unset($value, $list);
377 unset($id, $counter);
378
379 return $files;
380 }
381
386 public static function delete($id)
387 {
388 global $DB;
389 global $USER_FIELD_MANAGER;
390
391 $id = (int)$id;
392 if ($id <= 0)
393 {
394 return false;
395 }
396
398 'select' => [
399 'ID',
400 'STATUS',
401 'DOC_TYPE',
402 ],
403 'filter' => [
404 '=ID' => $id,
405 ],
406 ]);
407 $document = $iterator->fetch();
408 if (empty($document))
409 {
410 return false;
411 }
412 unset($iterator);
413
414 if ($document['STATUS'] === 'Y')
415 {
416 $GLOBALS['APPLICATION']->ThrowException(
417 Loc::getMessage('CAT_DOC_WRONG_STATUS'),
418 self::DELETE_CONDUCTED_ERROR
419 );
420 return false;
421 }
422
423 $events = GetModuleEvents('catalog', 'OnBeforeDocumentDelete', true);
424 foreach($events as $event)
425 {
427 }
428
429 $DB->Query("DELETE FROM b_catalog_store_docs WHERE ID = ".$id, true);
430
431 $typeTableClass = Catalog\Document\StoreDocumentTableManager::getTableClassByType($document['DOC_TYPE']);
432 if ($typeTableClass)
433 {
434 $USER_FIELD_MANAGER->Delete($typeTableClass::getUfId(), $id);
435 }
436
437 static::deleteDocumentFiles($id);
440
441 $contractorsProvider = Contractor\Provider\Manager::getActiveProvider(Contractor\Provider\Manager::PROVIDER_STORE_DOCUMENT);
442 if ($contractorsProvider)
443 {
444 $contractorsProvider::onAfterDocumentDelete($id);
445 }
446 if (Loader::includeModule('crm'))
447 {
448 \Bitrix\Crm\Timeline\TimelineEntry::deleteByOwner(\CCrmOwnerType::StoreDocument, $id);
449 }
450
451 // First and second event - only for compatibility. Attention - order cannot change
452 $eventList = [
453 'OnDocumentBarcodeDelete',
454 'OnDocumentElementDelete',
455 'OnDocumentDelete',
456 ];
457
458 foreach ($eventList as $eventName)
459 {
460 foreach (GetModuleEvents('catalog', $eventName, true) as $event)
461 {
463 }
464 }
465
466 $item = [
467 'id' => $id,
468 ];
469 PullManager::getInstance()->sendDocumentDeletedEvent(
470 [
471 $item,
472 ]
473 );
474
475 return true;
476 }
477
478 protected static function deleteDocumentFiles(int $documentId): void
479 {
481 'select' => ['FILE_ID'],
482 'filter' => ['=DOCUMENT_ID' => $documentId],
483 ])->fetchAll();
484
485 $fileIds = array_column($documentFiles, 'FILE_ID');
486 foreach ($fileIds as $fileId)
487 {
488 CFile::Delete($fileId);
489 }
490
492 $helper = $connection->getSqlHelper();
493 $connection->queryExecute(
494 'delete from ' . $helper->quote(Catalog\StoreDocumentFileTable::getTableName())
495 . ' where ' . $helper->quote('DOCUMENT_ID') . ' = ' . $documentId
496 );
497 }
498
504 protected static function checkRequiredFields(array $arFields, string $docType): bool
505 {
506 global $APPLICATION;
507
508 $requiredFields = DocumentFieldsManager::getRequiredFields($docType);
509 foreach ($requiredFields as $requiredField)
510 {
511 if (
512 array_key_exists($requiredField, $arFields)
513 && !$arFields[$requiredField]
514 )
515 {
516 $APPLICATION->ThrowException(
518 'CAT_DOC_ERROR_REQUIRED_FIELD',
519 [
520 '#FIELD_NAME#' => $requiredField,
521 ]
522 )
523 );
524
525 return false;
526 }
527 }
528
529 return true;
530 }
531
537 protected static function checkFields($action, &$arFields)
538 {
539 global $DB;
540 global $APPLICATION;
541
542 if((($action == 'ADD') || isset($arFields["DOC_TYPE"])) && $arFields["DOC_TYPE"] == '' && !isset(self::$types[$arFields["DOC_TYPE"]]))
543 {
544 $APPLICATION->ThrowException(GetMessage("CAT_DOC_WRONG_TYPE"));
545 return false;
546 }
547 if((($action == 'ADD') || isset($arFields["SITE_ID"])) && $arFields["SITE_ID"] == '' )
548 {
549 $APPLICATION->ThrowException(GetMessage("CAT_DOC_WRONG_SITE_ID"));
550 return false;
551 }
552 if((($action == 'ADD') || isset($arFields["RESPONSIBLE_ID"])) && $arFields["RESPONSIBLE_ID"] == '' )
553 {
554 $APPLICATION->ThrowException(GetMessage("CAT_DOC_WRONG_RESPONSIBLE"));
555 return false;
556 }
557 if ($action == 'ADD' || array_key_exists('STATUS', $arFields))
558 {
559 $arFields['STATUS'] = (isset($arFields['STATUS']) && 'Y' === $arFields['STATUS'] ? 'Y' : 'N');
560 }
561 if(isset($arFields["STATUS"]))
562 {
563 $arFields['~DATE_STATUS'] = $DB->GetNowFunction();
564 }
565 if(isset($arFields["DATE_DOCUMENT"]) && (!$DB->IsDate($arFields["DATE_DOCUMENT"])))
566 {
567 unset($arFields["DATE_DOCUMENT"]);
568 $arFields['~DATE_DOCUMENT'] = $DB->GetNowFunction();
569 }
570 return true;
571 }
572
578 public static function conductDocument($documentId, $userId = 0)
579 {
580 global $APPLICATION;
581
582 if (!Catalog\Config\State::isUsedInventoryManagement())
583 {
584 $APPLICATION->ThrowException(
585 Loc::getMessage('CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE'),
586 self::STORE_CONTROL_DISABLED_CONDUCT_ERROR,
587 );
588
589 return false;
590 }
591
592 if (Catalog\Store\EnableWizard\Manager::isOnecMode())
593 {
594 $APPLICATION->ThrowException(Loc::getMessage('CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE_EXTERNAL_CATALOG'));
595
596 return false;
597 }
598
599 $documentId = (int)$documentId;
600 $userId = (int)$userId;
601 $currency = null;
602 $contractorId = 0;
603
604 $docTypes = CCatalogDocs::getList(
605 [],
606 [
607 'ID' => $documentId,
608 ],
609 false,
610 false,
611 [
612 'ID',
613 'DOC_TYPE',
614 'CURRENCY',
615 'CONTRACTOR_ID',
616 'STATUS',
617 ]
618 );
619
620 if($docType = $docTypes->Fetch())
621 {
622 if ($docType['STATUS'] !== self::CONDUCTED)
623 {
625 $documentClass = self::$types[$docType['DOC_TYPE']];
626
627 if($docType['CURRENCY'] <> '')
628 {
629 $currency = $docType['CURRENCY'];
630 }
631
632 if($docType['CONTRACTOR_ID'] <> '')
633 {
634 $contractorId = $docType['CONTRACTOR_ID'];
635 }
636
637 $result = $documentClass::conductDocument($documentId, $userId, $currency, $contractorId);
638 if($result)
639 {
640 $docFields = [
641 'STATUS' => self::CONDUCTED,
642 ];
643
644 if($userId > 0)
645 {
646 $docFields['STATUS_BY'] = $userId;
647 $docFields['MODIFIED_BY'] = $userId;
648 }
649
650 if(!self::update($documentId, $docFields))
651 {
652 return false;
653 }
654 }
655
656 if ($result !== false)
657 {
658 AddEventToStatFile('catalog', 'conductDocument', 'success', $docType['DOC_TYPE']);
659 }
660
661 return $result;
662 }
663
664 $APPLICATION->ThrowException(Loc::getMessage('CAT_DOC_STATUS_ALREADY_YES'));
665 }
666
667 return false;
668 }
669
675 public static function cancellationDocument($documentId, $userId = 0)
676 {
677 global $APPLICATION;
678
679 if (!Catalog\Config\State::isUsedInventoryManagement())
680 {
681 $APPLICATION->ThrowException(
682 GetMessage('CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE'),
683 self::STORE_CONTROL_DISABLED_CONDUCT_ERROR
684 );
685
686 return false;
687 }
688
689 if (Catalog\Store\EnableWizard\Manager::isOnecMode())
690 {
691 $APPLICATION->ThrowException(Loc::getMessage('CAT_DOC_CONDUCT_UNCONDUCT_NOT_AVAILABLE_EXTERNAL_CATALOG'));
692
693 return false;
694 }
695
696 $result = false;
697 $documentId = (int)$documentId;
698 $userId = (int)$userId;
699 $docType = null;
700 $dbDocType = CCatalogDocs::getList(
701 array(),
702 array("ID" => $documentId),
703 false,
704 false,
705 array('ID', 'DOC_TYPE', 'STATUS')
706 );
707 if($arDocType = $dbDocType->Fetch())
708 {
709 $docType = $arDocType["DOC_TYPE"];
710 if($arDocType["STATUS"] !== "Y")
711 {
712 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("CAT_DOC_ERROR_CANCEL_STATUS"));
713 return false;
714 }
716 $documentClass = self::$types[$arDocType["DOC_TYPE"]];
717
718 $result = $documentClass::cancellationDocument($documentId, $userId);
719 if($result !== false)
720 {
721 $arDocFields = [
722 'STATUS' => 'N',
723 'WAS_CANCELLED' => 'Y',
724 ];
725
726 if ($userId > 0)
727 {
728 $arDocFields["STATUS_BY"] = $userId;
729 }
730 if (!self::update($documentId, $arDocFields))
731 {
732 return false;
733 }
734 }
735 }
736
737 if ($result !== false)
738 {
739 AddEventToStatFile('catalog', 'cancelDocument', 'success', $docType);
740 }
741
742 return $result;
743 }
744
745 public static function OnIBlockElementDelete($productID)
746 {
747 global $DB;
748 $productID = (int)$productID;
749 if($productID > 0)
750 {
751 $dbDeleteElements = CCatalogStoreDocsElement::getList(array(), array("ELEMENT_ID" => $productID), false, false, array('ID'));
752 while($arDeleteElements = $dbDeleteElements->fetch())
753 {
754 CCatalogStoreDocsElement::delete($arDeleteElements["ID"]);
755 }
756 return $DB->Query("delete from b_catalog_store_barcode where PRODUCT_ID = ".$productID, true);
757 }
758 return true;
759 }
760
761 public static function OnCatalogStoreDelete($storeID)
762 {
763 global $DB;
764 $storeID = (int)$storeID;
765 if ($storeID <= 0)
766 return false;
767
768 return $DB->Query("delete from b_catalog_store_barcode where STORE_ID = ".$storeID, true);
769 }
770
771 public static function OnBeforeIBlockElementDelete($productID)
772 {
773 global $APPLICATION;
774
775 $productID = (int)$productID;
776 if ($productID > 0 && \Bitrix\Catalog\Config\State::isUsedInventoryManagement())
777 {
779 'select' => [
780 'ELEMENT_ID',
781 'ELEMENT_NAME' => 'ELEMENT.NAME',
782 ],
783 'filter' => [
784 '=ELEMENT_ID' => $productID,
785 ],
786 'limit' => 1,
787 ]);
788 $row = $iterator->fetch();
789 unset($iterator);
790 if (!empty($row))
791 {
792 $APPLICATION->ThrowException(GetMessage(
793 'CAT_DOC_ERROR_ELEMENT_IN_DOCUMENT_EXISTS',
794 [
795 '#ID#' => $row['ELEMENT_ID'],
796 '#NAME#' => $row['ELEMENT_NAME'],
797 ]
798 ));
799
800 return false;
801 }
802 }
803
804 return true;
805 }
806
807 public static function synchronizeStockQuantity($storeId, $iblockId = 0)
808 {
809 $storeId = (int)$storeId;
810 if ($storeId <= 0)
811 {
812 return false;
813 }
814 $iblockId = (int)$iblockId;
815
817 $helper = $connection->getSqlHelper();
818
819 $internalSql = 'select CP.QUANTITY + ' . $helper->getIsNullFunction('CP.QUANTITY_RESERVED', 0) . ', CP.ID, '.$storeId.' ';
820 if ($iblockId <= 0)
821 {
822 $internalSql .= 'from b_catalog_product CP where 1 = 1';
823 }
824 else
825 {
826 $internalSql .= 'from b_catalog_product CP inner join b_iblock_element IE on (CP.ID = IE.ID) where IE.IBLOCK_ID = '.$iblockId;
827 }
828
829 return $connection->query(
830 "insert into b_catalog_store_product (AMOUNT, PRODUCT_ID, STORE_ID) (".$internalSql.")"
831 );
832 }
833}
$connection
Определения actionsdefinitions.php:38
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getActiveProvider(string $providerName)
Определения Manager.php:26
static getConnection($name="")
Определения application.php:638
Определения loader.php:13
static includeModule($moduleName)
Определения loader.php:67
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
static getById($id)
Определения datamanager.php:364
static getList(array $parameters=array())
Определения datamanager.php:431
static delete($primary)
Определения datamanager.php:1644
static add(array $data)
Определения datamanager.php:877
static update($primary, array $data)
Определения datamanager.php:1256
Определения store_docs.php:14
static synchronizeStockQuantity($storeId, $iblockId=0)
Определения store_docs.php:807
static OnCatalogStoreDelete($storeID)
Определения store_docs.php:761
static convertFileList(array $fileMap, array $files)
Определения store_docs.php:306
static update($id, $arFields)
Определения store_docs.php:35
static saveFiles(int $documentId, array $files)
Определения store_docs.php:159
static checkFields($action, &$arFields)
Определения store_docs.php:537
const CANCELLED
Определения store_docs.php:28
static $types
Определения store_docs.php:15
static deleteDocumentFiles(int $documentId)
Определения store_docs.php:478
static checkRequiredFields(array $arFields, string $docType)
Определения store_docs.php:504
const CONDUCTED
Определения store_docs.php:27
static OnBeforeIBlockElementDelete($productID)
Определения store_docs.php:771
const DELETE_CONDUCTED_ERROR
Определения store_docs.php:24
static OnIBlockElementDelete($productID)
Определения store_docs.php:745
static getList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения store_docs.php:134
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
global $USER_FIELD_MANAGER
Определения attempt.php:6
$result
Определения get_property_values.php:14
$iblockId
Определения iblock_catalog_edit.php:30
global $DB
Определения cron_frame.php:29
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
AddEventToStatFile($module, $action, $tag, $label, $action_type='', $user_id=null)
Определения tools.php:3976
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$files
Определения mysql_to_pgsql.php:30
$GLOBALS['____1690880296']
Определения license.php:1
$counter
Определения options.php:5
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$currency
Определения template.php:266
$action
Определения file_dialog.php:21
$iterator
Определения yandex_run.php:610